2019-07-25に更新

PHPで爆速APIを作るとき工夫したこと

「サーモンランAPI」という配信専用のAPIです。
https://splamp.info/salmon/api/

任天堂ソフト「Splatoon2」のサーモンランの最新情報を取得できます。

爆速のために

Apacheサーバー上で、JSONデータを静的ファイルとして配信しています。

これまでスプランプ(※うちのサイト)では「スプステージ2」という名前でバトルステージの情報を返すAPIを運用してきたのですが、こちらはオプションの充実のために、PHPファイルにアクセスさせる動的な仕組みでした。

今回静的ファイルにした理由です。

  1. オプションを付けないほうがシンプル
    … タイムゾーンなどの混乱の解消のため、時間データはUnixtimeだけにしました。言語も日英同時に配信することにしました。

  2. サーバー負荷が激減する
    … 毎回DBにアクセスしたりせずに済むのでレスポンス速度が向上します。

  3. クライアントでキャッシュが有効になる
    … ヘッダのLast-ModifiedE-tagにより、クライアントでキャッシュが有効になります。

仕組み

APIのアクセス先は一見「/salmon/api/now」や「/salmon/api/all」のように見えますが、実は.htaccessで「/salmon/api/」の別の子フォルダにあるJSONファイルにリライトしています。
例:

RewriteEngine On
RewriteRule ^all$ xxx.xxx [L]

また、JSONファイルは更新用プログラムによって、定期的に新しいファイルに上書きされます。

更新用プログラムはcronで定期的に更新すべきかチェックしていて、更新があるとDBからデータを取得・整形して、出力します。

JSONは何となく可読性を高めたくなったので、インデントを付けたり無意味なエスケープを消したりしてみました。

$json = json_encode($output, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

ヘッダ問題

今回一番欠かせなかったのはヘッダの付与でした。

毎アクセス動的生成していた頃はPHPのheader()なんかを使っていたのですが、今回は静的ファイルですから、Apacheの力を借りる他ありません。

Apacheでは、.htaccessを使うと配下のファイルに対して指定したヘッダを付与することができます。

Header set (ヘッダ名) "(値)"

今回加えたヘッダは以下の二つです。

Header set Access-Control-Allow-Origin "*"
Header set Content-Type "application/json; charset=utf-8"

Content-Typeでは、文字化けしたりしないようにUTF-8を明示しています。

Access-Control-Allow-Originというのは見たことない人もいるのではないでしょうか。これは、JavaScriptにおいてクロスオリジンでアクセスしてもよいかの指定になります。

これをサーバーが明示的に許可しないとjsがアクセスすることはできません。jsでオープンなAPIが使えないなんてもったいない。*を指定することで誰でもアクセスできるようになります。(CORS / Cross-Origin Resource Sharingの許可、と呼ばれたりします。)

まとめ

  • サーバー上でキャッシュ(静的ファイル)を生成した
  • .htaccessでヘッダを指定した
  • Access-Control-Allow-Originの指定でjs勢にも利用してもらえる

感想

JavaScriptからのアクセス許可については、実際にjs勢の方から問い合わせがあって初めて気づきました。意外と見落としている方は多いんじゃないでしょうか。

個人的な信条として「サーバーサイドの魔法」というのがあります。サーバーサイドは制約が少なく、予想外のことができるということです。Apacheの設定ファイル.htaccessは特にその幅を広げてくれるので気に入っています。
他にも色々な機能があるので、調べてみると面白いと思います。
.htaccess の書き方 | murashun.jp

サーモンランAPIの他の記事

サーモンランAPIについて
https://splamp.info/salmon/api/

サーモンランAPIサンプル集(連載)
https://crieit.net/magazines/barley_ural/サーモンランAPIサンプル集

ツイッターでシェア
みんなに共有、忘れないようにメモ

ウラル

Splatoonの二次創作サイト「スプランプ」の管理人です。サーモンラン研究所やオクトチャット、フェス速報などを作りました。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント