はぢめてのPEAR::Cache_Lite

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

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

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

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;

}

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

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

  • このエントリーをはてなブックマークに追加

コメントを残す

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

*


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Spam Protection by WP-SpamFree