WebAPIをキャッシュしたい
本日は、お仕事の開発のお話です。
GWも過ぎましたので本格的に仕事モードに入ります。
PHPで色々なWebAPIを呼んで利用しているのですが、いかんせんWebサイトのアクセスが増えてくると何度も何度もWebAPIを呼ぶことになり、1日の呼出回数上限に引っかかってくる恐れがあります。
大抵のWebAPIには1ライセンスあたりの呼出回数の上限があります。
せっかくWebAPIを利用する事で人気が出て多くの人が来てくれても、それが原因でWebAPIを呼び出しすぎて上限オーバーでWebAPIを呼び出せなくなってしまっては元も子もないです(>_<)
何かしら対策は無いものでしょうか?
と、ちょっと調べてみると大抵の場合にはキャッシュという物を利用するようです。
キャッシュといっても現金ではありません(^-^;
コンピューターで実現されるキャッシュは下記のような意味になります。
キャッシュ (英: cache) は、CPUのバスやネットワークなど様々な情報伝達経路において、ある領域から他の領域へ情報を転送する際、その転送遅延を極力隠蔽し転送効率を向上するために考案された記憶階層の実現手段である。実装するシステムに応じてハードウェア・ソフトウェア双方の形態がある(今後コンピュータのプログラムなども含め全ての転送すべき情報をデータと表す)。
キャッシュ概要図
転送元と転送先の中間に位置し、データ内容の一部とその参照を保持する。データ転送元への転送要求があり、それへの参照が既にキャッシュに格納されていた場合は、元データからの転送は行わずキャッシュが転送を代行する(この状態をキャッシュヒット、キャッシュに所望のデータが存在せず元データから転送する状態をキャッシュミスという。なお、由来は不明で和製英語と思われるが日本の一部の文献及び資格試験において「キャッシュミスヒット」という用語が使われている)。もしくは出力データをある程度滞留させ、データ粒度を高める機能を持つ。これらによりデータの2種の局所性、すなわち時間的局所性と空間的局所性を活用し、データ転送の冗長性やオーバヘッドを低減させることで転送効率を向上させる。
コンピュータの各記憶領域を始めとして、ネットワークやデータベース、GPU、DSPなど様々なシステムの様々な階層に搭載されている。
ふむふむ。
「転送元と転送先の中間に位置し、データ内容の一部とその参照を保持する。」ものがキャッシュですね。
Webサイトって同じURLでアクセスされた場合は大抵同じ内容を表示すれば良いだけです。
Aさんがアクセスし、次にBさんがアクセスし、その次にCさんがアクセスした場合に、3人が見たい情報は一緒なはずです。
そこで、Aさんがアクセスして情報を取得して表示したら、その取得した情報をキャッシュに避けておきます。
すると次にBさんがアクセスした時には情報を取得し直すよりも、キャッシュの情報を表示する方が早く表示する事が出来ます。
キャッシュは大抵単なるテキストデータなので、早く読みだす事が可能です。
最後にCさんがアクセスする時にもキャッシュが残っていればキャッシュから読み出して表示し、キャッシュが無い場合には改めて情報を取得し直して表示するという使い方をします。
ですので今回はこのキャッシュを使って、WebAPIの呼び出し回数を減らす様にしたいと考えています。
使うWebAPIによってキャッシュの保持期間は違うと思いますが、今回は取得後1週間程度は保持する方向で検討しています。
PHPでキャッシュを使う
PHPで使えるキャッシュは色々とあるようですが、簡単に利用可能なファイルキャッシュを今回は使ってみたいと思います。
一時フォルダ(tmp)にキャッシュファイルを作ってそのファイル内にキャッシュ情報を保持するタイプです。
調べていくと・・・
キャッシュを導入して、快適なページ表示を実現する
前回まで、各WebサービスAPIの利用方法とマッシュアップサイトの作り方を解説してきました。実はAPIを利用したサイトを運営していると、以下の3つの問題点が浮き彫りになります。
- API提供元サーバーへの負荷
- 自分のサーバーへの負荷
- ユーザー閲覧時のレスポンスの遅さ
今回は、キャッシュの仕組みとしてPEARライブラリのCache_Liteを利用する手順を解説します。サーバーにCache_Liteがインストールされていない場合は、以下のコマンドを入力してサーバーにインストールして下さい。
ふむふむ。
PEARライブラリのCache_Liteが簡単便利なようですね(^-^)v
Cache_Liteクラスを使うには、PEARライブラリが必要そうです。
以前、レンタルサーバーにPEARを入れたことがあったような・・・、っとありました!
下記サブブログの記事に書きましたが、さくらのレンタルサーバーにPEARライブラリを入れました!
ただ今回使いたいWebサイトはロリポップのレンタルサーバーになるので、ちょっとPEARライブラリの入れ方が違うかもしれません。
備忘録も兼ねてロリポップでのPEARライブラリのインストール方法をまとめておきたいと思います(^-^)/
ロリポップ・レンタルサーバーにPEARをインストールする方法
詳しくは下記サイトに載っています。
こちらを参考にさせて頂いて、実際にやってみた作業手順が下記になります。
【ロリポップにPEARライブラリとCache_Liteをインストールする方法】
- go-pearのソースをコピペしてgo-pear.phpを作る!
- レンタルサーバー上でgo-pear.phpを実行しインストール!
- Cache_Liteクラスをインストールする!
- phpファイルにインクルードパスとクラス読込の記載を追加する!
という手順です。
1.go-pearのソースをコピペしてgo-pear.phpを作る!
下記リンクを開きphpソースをコピーする。
エディターでUTF-8エンコードのテキストファイルを作り、上記でコピーしたソースコードをペースト(貼り付け)する。
ファイル名は「go-pear.php」としておきます。
2.レンタルサーバー上でgo-pear.phpを実行しインストール!
ロリポップのレンタルサーバーにFFFTP等で繋いで、ルートフォルダ(最上位フォルダ)にPEARをインストールするフォルダを作成します。
「lib」というフォルダ名にして作りました。
そしてlibフォルダ内に「go-pear.php」ファイルをアップし、ブラウザでアクセスします。
すると下記様な画面が表示されます。
きれいにPEARライブラリがインストールが出来ました!
この時に表示される「/home/users/2/hoge.hoge/web/lib/PEAR」みたいな表記がPEARライブラリのインストールパスになります。
下記の赤枠で囲った部分ですね。
これは後程、phpファイルに記述したりする必要があるので、ページ遷移前にテキストファイル等にコピペしてメモしておきましょう!
そして、「go-pear.php」ファイルは今後使わないですし、残しておくと誰かに悪さされかねないので、ファイルを削除して起きましょう!
3.Cache_Liteクラスをインストールする!
続いてPEARライブラリに入っているCache_Liteクラスをインストールします。
先ほどインストールしたlibフォルダ内に「index.php」ファイルができていますので、そのファイルにアクセスします。
下記のような画面が出ます。
そして右上の検索窓に「Cache_Lite」と入力し検索します。
すると色々と出てくるので、緑色のプラスマークが出てきていたらそれをクリックします。
するとCache_Liteがインストールされます。
で、このまま「index.php」を操作出来る状態にしておくと他社から好き放題にPEARライブらいをいじくられてしまうので、アクセス出来ないようにアクセス権限を「000」にしておきます。
その後アクセスし直すと下記のように「403エラー」が返ってきます。
4.phpファイルにインクルードパスとクラス読込の記載を追加する!
ここまででPEARとCache_Liteクラスが使える様になりました!
後は、実際に使うPHPファイル内で宣言して呼び出して使えばOKです。
コードは下記の様になります。
<?php // Cache_Liteインクルード ini_set('include_path', '.:/home/users/2/hoge.hoge/web/lib/PEAR'); // クラス読み込み require_once('Cache/Lite.php'); ?>
「/home/users/2/hoge.hoge/web/lib/PEAR」の部分を自分が実際にインストールした際のパスを設定します。
先ほどメモしておいたパスをコピペして使います。
これでロリポップのレンタルサーバーでPEARライブラリとCache_Liteクラスを使う事が出来るようになりました(^-^)v
Cache_Liteで初キャッシュ!
でわ実際にCache_Liteクラスを使用してPHPでキャッシュを使ってみましょう!
今回作るものは簡単な物が良いので「現在日時を取得して、そのキャッシュを10秒間だけ取得しておく」という物を作ってみたいと思います!
・・・(実装中)・・・
出来ました!
完成したソースコードは下記。
<?php // Cache_Liteインクルード ini_set('include_path', '.:/home/users/2/hoge.hoge/web/lib/PEAR'); // クラス読み込み require_once('Cache/Lite.php'); // IDのセット $cache_id = '123456'; // オプション $options = array( 'cacheDir' => '/tmp/', 'caching' => 'true', // キャッシュを有効に 'automaticSerialization' => 'true', // 配列を保存可能に 'lifeTime' => 10, // 10(生存時間:10秒) 'automaticCleaningFactor' => 200, // 自動で古いファイルを削除(1/200の確率で実行) 'hashedDirectoryLevel' => 1, // ディレクトリ階層の深さ(高速になる) ); // オブジェクトのnew $cache = new Cache_Lite($options); // キャッシュデータがあるかどうかの判別 if ( $cache_data = $cache->get($cache_id) ) { echo "【キャッシュ使用】<br>"; $buff = $cache_data; } else { // キャッシュデータがない。APIからデータを読み込む処理 // データ取得処理ここから // ……………………… $read_data にデータを入れておく $read_data = date('Y/m/d H:i:s'); // データ取得処理ここまで echo "【キャッシュ未使用】<br>"; $buff = $read_data; $cache->save($buff); } print_r($buff); ?>
if文の「if ( $cache_data = $cache->get($cache_id) )」のところで、キャッシュの有無を切り分けて処理を分岐させています。
初回起動時や10秒経過後はif文のelse側の処理を実行し、キャッシュファイルがある間にアクセスされるとif文の上側の処理を実行します。
実際に動作させてみるとうまく動きました!
初回アクセス時には「キャッシュ未使用」と表示されます。
ですがその直後にブラウザをリロードしてアクセスし直すと「キャッシュ使用」と表示されます!
キャッシュが使えました!
でも10秒以上経ってからアクセスすると、キャッシュファイルがなくなっているので「キャッシュ未使用」と表示されます(^-^)v
うまくキャッシュを動作させることが出来ました!
デザインはBootstrap
ではせっかくなので皆さんにも試してもらいましょう!
そのままでは味気ないサイトになっているので、Bootstrapを利用してデザインの良いページにしてアップしたいな、と。
さらっと作るので、今回はBootstrapEditorを利用します。
【オンラインBootstrapエディター】
Bootstrap Editor
サクッとデザインを適用してアップし直しました!
デザイン適用後は下記の様な感じに♪
下記リンクをクリックして頂けると実際に試せます(^-^)v
ぜひぜひご感想などをお寄せ下さい(^-^)/
という訳で、本日はPHPで初キャッシュ体験をする事が出来ました!
明日の実仕事ではWebAPIの呼び出し部分をキャッシュに格納して使ってみたいと思います(^-^)/
まとめ
- WebAPIの呼び出し回数を減らしたい → キャッシュを使う事で減らすことが可能!
- PHPで簡単にキャッシュを使いたいならPEARライブラリのCache_Liteが手軽に試せて良いみたい!
- ロリポップにPEARライブラリをインストールする方法とCache_Liteクラスをインストールする方法を図解!
- 実際にキャッシュを使って試すことが出来た!