負荷分散でキャッシュをするのはよくあることですが
PHPで似たようなことをしてみました。
ライブラリとか使わないで後から知ったのですがPearにも似たようなことが出来るものがあるそうです。
ちなみにはじめてclassというものを触ってみました。
class getcontents
{
function cashgetcontents($url)
{
/*
* 設定
*/
// キャッシュ有効時間(秒)
$timelimit = "5";
// キャッシュ保存ディレクトリ
$cachedir = "tmp/";
// URL Hash化
$filenamehash = md5($url);
if( !fileexists($cachedir.$filenamehash) )
{
// 初回アクセス時はファイル作成
$result = $this->stealcontents($url);
fileputcontents($cachedir.$filenamehash, $result);
}
else
{
/*
* ファイルがある場合はキャッシュ時間を確認
* 時間内ならキャッシュを、経過していれば新たに取得
*/
if (fileexists($cachedir.$filenamehash) && (filemtime($cachedir.$filenamehash) + $timelimit) < time() )
{
/*
* キャッシュする
*/
$result = $this->stealcontents($url);
// fileputcontents でキャッシュ
fileputcontents($cachedir.$filenamehash, $result);
}
else
{
/*
* キャッシュを返す
*/
$result = filegetcontents($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/');
関連記事