Pear::Cache_Liteを使ってAmazonのxmlデータをキャッシュさせる実験用ソース

キャッシュ by you.

最近、どんどんWebサービスの世界に引き込まれている今日この頃。

ようやくキャッシュさせなきゃと思って調べたPear::Cache_Lite。ちょうどCORESERVER.JP にもインストール済みというのを確認したので、実験用ソースを作成し設置して速度感も体験してみました。

Amazonのキャッシュとその努力と涙の結果出力テスト

やはりキャッシュしたほうが表示が速いし、こちらのレンタルサーバーAmazonさんにも負荷をかけなくてWin-Winの関係(?)で使えそうです。

当然Webサービスを利用するときは利用制限回数とか負荷をかけないようにする必要があるので、これはぜひとも実装したいです。

さて、参考にさせてもらったサイトは以下2サイト。

PHPで指折りに便利なfile_get_contents関数を使いこなす (後編) – ホリデープログラミング入門 – Yahoo!ブログ

Cache_Lite でデータをキャッシュする – bnote

基本的にどちらも同じことを書いているのですが、上記を元にサンプルソースを作成しました。

今、表示されているデータがキャッシュされて表示されたものか、そうでないかわかるように、それを表示するようにしています。


<?php
require_once 'Cache/Lite.php';//これがサーバーに入っている前提で

// エスケープ用
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES);
}

// リクエストURLを組み立てる
$awsUrl = 'http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService';
$awsUrl .= '&SubscriptionId=<Amazonの開発者用ID>';
$awsUrl .= '&Operation=ItemSearch&SearchIndex=Music&Artist=CCB';
$awsUrl .= '&ResponseGroup=Medium';
// ↓リクエストURL確認用「//」をはずしたら画面に出力
// echo $awsUrl;

// キャッシュの設定情報をここに入れる
$cacheOptions = array (
    'cacheDir' => './tmp/',
    'lifeTime' => '60',// 60秒
);

$cacheId = $awsUrl;

$objCache = new Cache_Lite($cacheOptions);

if ($cache = $objCache->get($cacheId)) {
    // キャッシュがあればキャッシュからデータを取得
    $awsBuff = $cache;
    $b="キャッシュからだ!<br />";
}
else{
    // キャッシュがなければデータを取りに行く
    $awsBuff = file_get_contents($awsUrl);
    $objCache->save($awsBuff,$cacheId);// キャッシュとして保存
    $b="たった今取得したよ^^<br />";
}
$results = simplexml_load_string ($awsBuff);
// 結果が0件のときのエラー処理書いてません。すんません。
$items = $results->Items->Item;
print $results;

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" >
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Amazonのキャッシュとその努力と涙の結果出力テスト</title>
</head>
<body>
<p align="center"><?php
// キャッシュからデータを拾ったのか今取得したデータなのか正直に説明する
print $b;
?></p>
<div style="width:600px;background-color:#FFFFFF;margin-left: auto;margin-right: auto;padding: 12px;border-top: dotted 1px #0066CC;border-bottom: dotted 1px #0066CC;">
<!-- ここから繰り返し 開始 -->
<?php
foreach ($items as $item) {
// PHPで一度全部変数に格納してしまう
$title = h($item->ItemAttributes->Title); // 商品名
$linkurl = h($item->DetailPageURL); // リンク先URL
?>
<a href="<?php echo $linkurl; ?>" target="_blank"><?php echo $title; ?>の詳細へ</a><br />
<?php
}
?>
<!-- ここまで繰り返し 終了 -->

</div>
</body>
</html>

UTF-8で適当な名前をつけて保存してサーバーにアップします(XAMPP等でローカル環境で実行しても良い。ボクはそれでテストしてからレンタルサーバーにアップしています)。

アップした階層に「tmp」フォルダを作成し、パーミッションを707に設定(Windowsローカルの場合はフォルダプロパティの読み取り専用チェックをはずす)。

それで実行すると1度目はAmazonからデータを取得して表示します。ちょっと反応が鈍いように感じます。

その直後もう一回リロードすると、今度は素早いです。「キャッシュからだ!」と表示されるのでキャッシュからの表示は素早いことが確認できます。このときはAmazon側にデータをリクエストしていません。先ほど作成した「tmp」フォルダにキャッシュされたデータが格納されています。

1分ほどしてからリロードするとキャッシュの有効期限が切れているので、再度Amazonからデータを取得してデータを表示します。やっぱり、このとき少し遅いと感じるし、Amazonのサーバーに負荷をかけていることがわかります。

ちょっと使いこなせるように頑張ってみたいです。

ちなみに検索している内容はミュージックの中で「CCB」です。日本語エンコードが面倒だったので、アルファベットのアーティストが「CCB」しか思い浮かばなかったボクは、相当ヤバイです・・・。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です