Services_Amazonでアマゾンのランキングを表示(おまけ)

Services_Amazonでアマゾンのランキングを表示(完結編) 」でServices_Amazonでアマゾンのランキング表示させることに成功しましたが、キャッシュを使っていなかったため、ページ出力のたびにAmazonAPIに問い合わせに行っていました。これでは非効率なのでキャッシュを利用してAmazonAPIにもサーバにも負担をかけないように修正してみました。

PEAR の Cacheを導入

まず、pear を使ってCache用のパッケージをインストールします。


# pear install cache
WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-update pear.php.net" to update
WARNING: "pear/HTTP_Request" is deprecated in favor of "pear/HTTP_Request2"
downloading Cache-1.5.6.tar ...
Starting to download Cache-1.5.6.tar (Unknown size)
.....................................done: 177,152 bytes
install ok: channel://pear.php.net/Cache-1.5.6
 

次にキャッシュ用のディレクトリを作成します。
キャッシュ用のディレクトリはWEBサーバのプロセスを起動しているユーザから書き込み権限が必要になるようです。詳細は後で記載します。


# cd /usr/local/www
# mkdir cache 
# chown www:www  cache
# ls -ld /usr/local/www/cache/
drwxr-xr-x 3 www www 512 Apr 19 00:20 /usr/local/www/cache/
 


アマゾンAPI検索結果のキャッシュを有効

アマゾンランキング表示プログラムにCacheを使うコードを追加します。前回の完結編から追加した部分を赤文字にしています。キャッシュの保持時間は setCacheExpire で指定して下さい。ここでは setCacheExpire の値を 43200(秒)=12時間としています。


<?php
 
require_once('Services/Amazon.php');
require_once('Cache.php');
 
header("Content-type: application/x-javascript");
 
$category = $_GET['category'];
$param = $_GET['param'];
 
define('ACCESSKEY_ID', 'XXXXXXXXXXXXXXX');
define('SECRET_ACCESSKEY', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define('ASSOCIATE_ID', 'XXXXXXXX-22');
define('ECS_VERSION','2009-03-31');
define('RESPONSE_GROUP','Small,Images,ItemAttributes,OfferSummary,Reviews');
 
$sort = 'salesrank';
$page_id='1';
$amaarray='';
 
$result = get_item_by_browsenode($category,$param,$sort,$page_id);
 
if (!PEAR::isError($result))
{
        for( $i = 0; $i <  5; $i++ )
        {
                $asin = $result['Item'][$i]['ASIN'];
 
                $url = "<a href=http://www.amazon.co.jp/exec/obidos/ASIN/".$asin."/".ASSOCIATE_ID."/ref=nosim/><img src='".$result['Item'][$i]['MediumImage']['URL']."'><br>";
                $title = $result['Item'][$i]['ItemAttributes']['Title'].'</a><br><br>';
                $amaarray = $amaarray.$url.$title;
        }
}
 
echo "document.write(\"$amaarray\")";
 
function get_item_by_browsenode($category,$param,$sort,$page_id){
 
    $amazon = new Services_Amazon(ACCESSKEY_ID,SECRET_ACCESSKEY,ASSOCIATE_ID);
    $amazon->setLocale('JP');
    $amazon->setCache('file',array('cache_dir' => '/usr/local/www/cache/'));
    $amazon->setCacheExpire(43200);
    $options = array();
    $options['BrowseNode'] = $param;
    $options['Sort'] = $sort;
    $options['ResponseGroup'] = RESPONSE_GROUP;
    $options['ItemPage'] = $page_id;
 
    $ret = $amazon->ItemSearch($category,$options);
    return $ret;
}
?>
 


キャッシュの確認

WEBブラウザからプログラムにアクセスして、アマゾンランキングを表示してみてください。キャッシュフォルダにファイルが作成されていればキャッシュは成功です。キャッシュに適切な書き込み権限がない場合、キャッシュファイルが作成されません。キャッシュファイルは作成されなくてもWEBブラウザにエラーは表示されませんので注意してください。

# ls -l /usr/local/www/cache/default/
total 638
-rw-r--r-- 1 www www 95772 Apr 19 00:32 1a7f0d2063f76c2216970254d61de6d7
-rw-r--r-- 1 www www 110940 Apr 19 00:32 27da0219890beeb6407ddac3db2de2c0
-rw-r--r-- 1 www www 211776 Apr 19 00:32 a65e2d5bad0e3c5ec86e4e1f488d35c5
-rw-r--r-- 1 www www 142916 Apr 19 00:32 dee43005aaaf24aae2eca2b6799dad5b
-rw-r--r-- 1 www www 71196 Apr 19 00:32 eab770091ee2c7ca1c5db90ac450ee30

キャッシュの効果

PHPプログラムが、アマゾンランキングの1位~5位までの結果を取得するまでの時間をキャッシュ有りとキャッシュ無しでどれだけ差が出るか簡単な時間計測プログラムを追加して調べてみました。(※WEBブラウザの表示が終わる時間ではありませんので注意してください。)

回数 キャッシュ無し キャッシュ有り
1回目 0.96475 秒 0.00415 秒
2回目 1.12499 秒 0.00377 秒
3回目 0.88769 秒 0.00347 秒
4回目 0.76170 秒 0.00348 秒
5回目 1.00916 秒 0.00376 秒

キャッシュ無しはAPIに問い合わせを行っているので1秒近くかかっていますが、キャッシュ有りの場合は、ほとんど時間がかかっていませんので、キャッシュがかなり有効に効いていることがわかります。

関連記事

人気記事のランキング

トラックバックURL

このエントリーのトラックバックURL:
http://or2.to/mt/mt-tb-mt.cgi/86

コメントする