phpのキャッシュ機能にpearのCache_Lite()を使用する
WebAPI(ウェブサービス)を利用してサイトを構築する場合、負荷・スピードを考えるとWebAPIの結果をキャッシュする事は必須だと言えます。
phpではpearのCache_Liteというキャッシュ機能を実現するモジュールがありますし、php5の標準で装備されているsimplexml_load_fileはxmlファイルを返すwebAPIのリクエストに使えます。
(simplexml_load_file関数はXMLファイルをパースし、オブジェクトに代入します。)

流れ的には以下のようになります。
①キャッシュが存在しない場合はsimplexml_load_file関数でWebAPIリクエストし、レスポンス結果(xml)をSimpleXMLオブジェクトに代入する。
②レスポンス結果のSimpleXMLオブジェクトを表示したいhtmlに変換してそのhtml(文字列)をCache_Liteでキャッシュする。
この辺りの詳細については「phpのキャッシュ機能にpearのCache_Lite()を使用する(phpサンプルプログラム)」に書いていますので参考にしてください。
simplexml_load_fileで取得したxmlオブジェクトがpearのCache_Liteでキャッシュできない
キャッシュするタイミングについてもう少し考えてみます。WebAPIレスポンスのxmlファイルを色々なhtmlに整形したい場合はxmlファイルの状態でキャッシュした方がいいでしょう。
しかし、最初に説明したようにhtmlに変換した状態(ただの文字列)ではCache_Liteでキャッシュすることができますが、simplexml_load_fileでWebAPIのレスポンス値を取得したSimpleXMLオブジェクトはCache_Liteでキャッシュできないようです。
それなら、SimpleXMLオブジェクトをserialize化してからキャッシュしようと考えたのですが、私がネットで調べた範囲ではどうもSimpleXMLオブジェクトのserialize化も無理のようです。
ですので、ここは単純にWebAPIの返すxmlファイルを文字列としてキャッシュしてから処理することにしてみました。流れ的には以下のようになります。
①キャッシュが存在しない場合はfile_get_contents関数でWebAPIリクエストし、xmlファイルを文字列として受け取る。
②①のxml文字列をCache_Liteでキャッシュする。
③simplexml_load_string関数を使ってxml文字列をSimpleXMLブジェクトに変換し以降はこのオブジェクトを扱う。
もちろん、SimpleXMLブジェクトに変換する必要はない、正規表現を使って全部文字列で扱う方がいいという方もいるでしょう。この辺りは好みの問題です。
phpのサンプルプログラム
それでは、以下にphpのサンプルプログラムを示します。

<?php

//Cache_Liteを利用するためのファイル読込み
require_once("Cache/Lite.php");

//リクエストするWebAPIのURL(皆さんの目的のURLをセットしてください)
$requestUrl = "";
//xmlファイルの内容を受け取る文字列変数
$xmlStr = "";

//キャッシュオプションを設定した変数の作成
$cacheOptions = array(
  'cacheDir' => './cache/',  //キャッシュディレクトリをcacheに設定
  'lifeTime' => '600',    //キャッシュデータ保持する時間を10分間に設定(秒単位)
);

//キャッシュID設定(ID毎にキャッシュする。ここではキャッシュIDを固定(testId)していますが、実用性を考えるとこの変数は動的に扱うことになると思います。)
$cacheId = "testId";
//Cache_Liteオブジェクト生成
$Cache_Lite = new Cache_Lite($cacheOptions);
//$Cache_Lite->get($cacheId)で指定したIDの有効なキャッシュデータがキャッシュディレクトリに存在するかどうかを返す。
if($data = $Cache_Lite->get($cacheId)){
  //有効なキャッシュがある場合の処理
  //キャッシュデータを変数にセット
  $xmlStr = $data;
}else{
  //有効なキャッシュがない場合の処理
  //APIリクエストする
  $xmlStr = @file_get_contents($requestUrl);
  //キャッシュ保存
  $Cache_Lite->save($xmlStr,$cacheId);
}
//xml文字列をsimpleXmlオブジェクトに変換
$xmlData = simplexml_load_string($xmlStr);
//以降xmlオブジェクト($xmlData)を処理する


?>

プログラムの詳細については各コメントを参考にしてください。
サンプルプログラムではキャッシュする保存場所をcacheディレクトリに指定していますので、事前にcacheディレクトリを作成して書込み権限を与えておく必要があります。
以上です。もっといい方法がある、間違った内容が書いてある場合は下記のコメント欄からご指摘ください。お願いします。

参考サイト
[PHP]simplexml_load_file、Pear Cache_Liteについての質問です(はてな)
Pear Cache_Liteのマニュアル

コメントを投稿する
名前 : 
URL : 
 *入力文字数は全角700文字までです。
おすすめPHP入門書
ノートパソコンの売れ筋ランキング(週間)情報 ~ セカンドマシン探し!
( 集計日:~2012/02/03 )
Webサービス by Yahoo! JAPAN