やりたいこと
負荷の高いphpコードの実行回数を減らし、負荷を抑制したい。
Cache::Lite も memchaced も使えない環境で、テキストデータで擬似キャッシュファイルを生成し、負荷の軽減を試みる。
やろうとすること
- PHPの実行結果をテキストファイルにデータを保存する
- テキストファイル生成後、1分以内にアクセスがあったら、テキストの内容を出力する
- テキストファイル生成後、1分経過したあとにアクセスがあったら、再度処理を行い、結果を出力後テキストデータを書き換える
書いてみた
<?php
// 処理速度の開始時間を記録
$time_start = microtime(true);
// 擬似キャッシュファイルを定義
$cache = "cache.txt";
// 擬似キャッシュファイルが存在しない場合、ファイルを生成する
if(!file_exists($cache)){
touch($cache);
echo("擬似キャッシュファイルを生成しました。\n");
}
// 擬似キャッシュファイルの中身を読み込み、生成時間が60秒以内かを確認する
// 60秒以上経っている場合、フラグを立てる
$genTime = filemtime($cache);
$cacheTime = 60;
if(($genTime + $cacheTime) < time() ){
$cacheFlag = 1;
}
// 擬似キャッシュファイルがNullの場合、もしくは擬似キャッシュが生成後1分経っていた場合、関数genCacheを実行する。生成後の時間確認には関数checkTimeを使う。擬似キャッシュファイルの内容が存在する場合、その内容を表示する。
$cachedata = file_get_contents($cache);
if ( !isset($cachedata) || isset($cacheFlag) ){
genCache();
} else {
print ($cachedata);
print ("キャッシュデータが存在したため、その内容を出力しました。\n");
}
// 関数genCacheを定義。
// 日付データを生成してその内容を出力後、擬似キャッシュファイルへ内容を書き込む
function genCache(){
$cache = "cache.txt";
$currentDate = date("Y年m月d日 H時i分s秒");
echo $currentDate;
echo ("関数genCacheからデータを出力");
file_put_contents($cache, $currentDate, LOCK_EX);
echo("擬似キャッシュファイルへの書き込み完了");
// 実際の処理。ここではテスト用にループを回す
for( $i=0; $i<10000; $i++ ){
}
}
// 処理速度の終了時間を計測
$timelimit = microtime(true) - $time_start;
echo $timelimit . ' seconds';
?>
実行してみた
2015年08月25日 10時13分54秒
関数genCacheからデータを出力擬似キャッシュファイルへの書き込み完了
0.010881900787354 seconds
2015年08月25日 10時13分54秒
キャッシュデータが存在したため、その内容を出力しました。
0.00022101402282715 seconds
2015年08月25日 10時13分54秒
キャッシュデータが存在したため、その内容を出力しました。
0.00016689300537109 seconds
2015年08月25日 10時15分01秒
関数genCacheからデータを出力擬似キャッシュファイルへの書き込み完了
0.00077390670776367 seconds
少しはキャッシュの役割を果たせているでしょうか。