はぢめてのPEAR::Cache_Lite

2012年の今、あえて話題にするシリーズその2です。

某氏に「PEARのCache_Liteの使い方がわからん」と言われたので、メールするくらいなら公開してしまえ、ということで(二毛作二毛作。。。)。

ま、たとえばこんなfunction。ある商品のASINでamazonのapi叩いて、在庫状況見て結果を戻す、と。で、それをキャッシュしとかないと悲惨なことになる、と(経験者の言葉は重い)。

[php]function amazon_affiliate($isbn){

$associate_tag = ‘アマゾンアソシエイトのIDが入ります’;
$access_key_id = ‘amazon apiのアクセスキーが入ります’;
$secret_access_key = ‘amazon apiのシークレットアクセスキーが入ります’;
$baseurl = ‘http://ecs.amazonaws.jp/onca/xml’;
$params = array();
$params[‘Service’] = ‘AWSECommerceService’;$params[‘AssociateTag’] = $associate_tag;
$params[‘AWSAccessKeyId’] = $access_key_id;
$params[‘Version’] = ‘2011-09-01’;
$params[‘Operation’] = ‘ItemLookup’;
$params[‘ItemId’] = $isbn;
$params[‘ResponseGroup’] = ‘Offers’;
$params[‘Timestamp’] = gmdate(‘Y-m-d\TH:i:s\Z’);
ksort($params);
$canonical_string = ”;
foreach ($params as $k => $v) {
$canonical_string .= ‘&’.urlencode_rfc3986($k).’=’.urlencode_rfc3986($v);
}
$canonical_string = substr($canonical_string, 1);

// 署名を作成します
$parsed_url = parse_url($baseurl);$string_to_sign = "GET\n{$parsed_url[‘host’]}\n{$parsed_url[‘path’]}\n{$canonical_string}";
$signature = base64_encode(hash_hmac(‘sha256′, $string_to_sign, $secret_access_key, true));

// URL を作成します
$url = $baseurl.’?’.$canonical_string.’&Signature=’.urlencode_rfc3986($signature);

//キャッシングしつつ
require_once ‘Cache/Lite.php’;

//キャッシュ用ディレクトリ作成
$path = "/tmp/aws";
if ( !file_exists($path) ) {
mkdir( $path,0777 ) ;
}

// キャッシュの設定情報をここに入れる
$cacheOptions = array (
‘cacheDir’ => ‘キャッシュをぶちこんどくディレクトリを掘って、そこを指定’,
‘lifeTime’ => ‘3600’,//一時間
);

$cacheId = $isbn;

$objCache = new Cache_Lite($cacheOptions);

if ($cache = $objCache->get($cacheId)) {
// キャッシュがあればキャッシュからデータを取得
$awsBuff = $cache;
}
else{
// キャッシュがなければデータを取りに行く
$awsBuff = file_get_contents($url);
$objCache->save($awsBuff,$cacheId);// キャッシュとして保存
}

$amazon = simplexml_load_string($awsBuff);
$amazon[‘Availability’] = $amazon->Items->Item->Offers->Offer->OfferListing->Availability;

if( $amazon && $amazon->Items->Item->OfferSummary->TotalNew > 0){
$amazon_affiliate = "<a href=\"http://www.amazon.co.jp/exec/obidos/ASIN/" . $isbn . "/hanmotocom-22\" title=\"アマゾンの購入画面へ移動\">アマゾン(" . $amazon[‘Availability’] . ")</a>|" ;
} elseif($amazon->Items->Item->OfferSummary->TotalNew === 0) {
$amazon_affiliate = "<a href=\"http://www.amazon.co.jp/exec/obidos/ASIN/" . $isbn . "/hanmotocom-22\" title=\"アマゾンの購入画面へ移動\">アマゾン(新品の扱いはありません。中古品の出品:" . $amazon->Items->Item->OfferSummary->TotalUsed . "点 ¥ " . $amazon->Items->Item->OfferSummary->LowestUsedPrice->Amount . "より)</a>|" ;
} else {
$amazon_affiliate = "アマゾン|" ;
}

return $amazon_affiliate;

}[/php]

前半はまあamazon apiフクザツになってきてめんどいですね、という話でして、キモは「 require_once ‘Cache/Lite.php’;」以降ですね。要は取得したオブジェクトを好きな背番号つきでキャッシュして、照合しているだけ、です。簡単でそ?

えーと、このエントリのためにあちこちぐぐったんですが、もはや元ネタがなんだかわかんなくなってしまいました。先人のみなさまスイマセン<(_ _)>

関連してそうなエントリ

日高崇