Authentication




Cancel OK
B!コメントする  2013-01-14 00:02:00 by old

PHPでキャッシュしてみる

負荷分散でキャッシュをするのはよくあることですが
PHPで似たようなことをしてみました。

ライブラリとか使わないで後から知ったのですがPearにも似たようなことが出来るものがあるそうです。
ちなみにはじめてclassというものを触ってみました。

class getcontents
{
function cash
getcontents($url)
{
/*
* 設定
*/
// キャッシュ有効時間(秒)
$time
limit = "5";
// キャッシュ保存ディレクトリ
$cachedir = "tmp/";
// URL Hash化
$file
namehash = md5($url);

if( !file
exists($cachedir.$filenamehash) )
{
// 初回アクセス時はファイル作成
$result = $this->steal
contents($url);
fileputcontents($cachedir.$filenamehash, $result);
}
else
{
/*
* ファイルがある場合はキャッシュ時間を確認
* 時間内ならキャッシュを、経過していれば新たに取得
*/

if (file
exists($cachedir.$filenamehash) && (filemtime($cachedir.$filenamehash) + $timelimit) < time() )
{
/*
* キャッシュする
*/
$result = $this->steal
contents($url);
// fileputcontents でキャッシュ
fileputcontents($cachedir.$filenamehash, $result);
}
else
{
/*
* キャッシュを返す
*/
$result = file
getcontents($cachedir.$filenamehash);

}
}
return $result;
}

/*
* コンテンツ取得
*/
function steal_contents($url)
{
// curl で取得する
$ch = curl_init(); // 初期化
curl_setopt( $ch, CURLOPT_URL, $url ); // オプション設定
// Location対策
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true ); // Locationがあれば辿る[safe_modeでは使えない]
curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 ); // Locationをn回迄辿る
// タイムアウト設定
//curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT_MS, 5 );
// SSL証明書を無視
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER,false );
curl_setopt( $ch,CURLOPT_SSL_VERIFYHOST,false );
// ヘッダーセット
$request_headers = array();
array_push($request_headers, "Connection: close");
array_push($request_headers, "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/18.0");
curl_setopt( $ch, CURLOPT_HTTPHEADER, $request_headers );
// 返り値
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // 返り値
curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true ); // 返り値をそのまま取得
$result = curl_exec( $ch ); // 実行 or 取得
curl_close($ch); // 終了

return $result;
}

}


使い方は簡単。

$obj = new get_contents();
$obj->cash_get_contents('http://zeijaku.net/');


5秒間ほどコンテンツをキャッシュします。
5秒以内ならキャッシュを返し、5秒経過したらコンテンツを新たに取得して返すというシンプルなものです。

キャッシュの保存先や有効時間は適当に変えてください。
頻繁に更新をするものでない場合はとても有効だと思います。
ちなみに比較した結果として

キャッシュあり
100回平均 0.00022秒
キャッシュなし
100回平均 0.18209秒

ネットワークの状況にもよりますがかなりの差がでます。
今回は単純にコンテンツ内容を取得するだけですが、配列で取得する場合(simple_xml等)はserialize化する必要があります。

車輪の再発明みたいですが意外と面白かった。
Pearのchacheも見てみたけどなるほどな~と思う部分が多かったです。
本当はIf-Modified-Sinceとかで確認してキャッシュも最新に保つとかちゃんとしたほうがいいのかもしれないですけど、そこまで厳密じゃなくてもいいし。


PHP  

  • コメント
  • コメントはまだありません