2011.11.30追記
Cache_Liteはキャッシュファイルを指定したディレクトリ作るのですが、これだとキャッシュファイルが増え続けて容量を圧迫してしまいます。Cache_Liteのキャッシュを削除するにはremove関数 とclean関数があるそうです。clean関数で削除条件をoldに指定すると、有効期限が切れたキャッシュファイルをまとめて削除してくれるようなので、この方法を採用しました。$objCache->clean(false,'old');
認めたくないものだな・・・
サイト開発を進める中で相手サーバの負荷を考慮してキャッシュしたデータにアクセスする方法がいいであろうと思いました。というかアマゾンさんへアクセスする際にはリクエスト回数に気を使う必要があるようです。そこで久しぶりにCache_Liteでキャッシュをとろうとしたら過去の自分はとんでもないことをしていたっぽいことに気がつきました。 当時の私はキャッシュが作られていることに満足して、キャッシュを表示していることを確認していなかったようです。いけませんね...。対応したので備忘録として残しておこうと思います。参照させていただいたエントリー
Pear::Cache_Liteを使ってAmazonのxmlデータをキャッシュさせる実験用ソース
Cache_Lite でデータをキャッシュする[Pear::Cache_Lite]
お約束
参照は自己責任でお願いします。やったこと
AmazonWebServiceのAPIを利用して検索結果を表示する仕組みを構築しているのですが、リクエスト制限があるそうなので、1時間ほど有効なキャッシュを作っておいて、有効期間内はキャッシュのデータを返すことにしました。はまったところ
最初$urlの値をキャッシュIDに設定していましたが、1回目のアクセスでキャッシュを作るのはいいのですが、2回目以降もせっせとキャッシュを作ってしまっていました。キャッシュIDに設定するにはよろしくないデータが$urlに格納されているようです。そこで、 検索キーワードを格納している$keywordの値をキャッシュIDに設定したところ、うまくいきました。
きになること
複数ページに分割されたページをキャッシュする時はどうすればいいのかしら?検索キーワードとページ数を合わせたものをキャッシュIDにすればうまくいくような気はしますがまだ試していません。例えばこんな感じです$cacheId = $keyword.$pagecount;
URLをキーしたいときはどうすればいいのだろう?気になるので他で試してみようと思います。
コードをごにょごにょ
require_once("./Cache_Lite/Lite.php");
// 検索するキーワード
$keyword = mb_convert_encoding('ガンダム','UTF8','auto');
$access_key_id = 'アクセスキー';
・
・省略
・
// URL を作成
$url = $baseurl.'?'.$string.'&Signature='.rfc3986_urlencode($signature);
// キャッシュの設定情報
$cacheOptions = array (
'cacheDir' => './tmp/',
'lifeTime' => '3600',// 1H
);
$cacheId = $keyword;
$objCache = new Cache_Lite($cacheOptions);
//生存期間より古いキャッシュファイルを削除する(2011.11.30追記)
$objCache->clean(false,'old');
if ($cache = $objCache->get($cacheId)) {
//キャッシュからデータを取得
$awsBuff = $cache;
$flgMsg="キャッシュを利用しています。<br />";
} else {
//データを取りに行く
$awsBuff = file_get_contents($url);
$objCache->save($awsBuff,$cacheId);// キャッシュとして保存
$flgMsg="キャッシュがアレだったのでデータを取得しました。<br />";
}
$xml = simplexml_load_string ($awsBuff);
1回目のアクセスでは「キャッシュがアレだったのでデータを取得しました。」メッセージが表示され、2回目以降は「キャッシュを利用しています」メッセージが表示され、反応も早いのでキャッシュのデータを返しているようです。前回Cache_Liteを使ったときキャッシュしたデータを利用していなかったのではないか?という疑念が取れませんが今回はキャッシュを利用してデータを返していることを確認しました。幅が広がったような気がします。