お絵かき掲示板交流サイトのトップページの負荷削減

お絵かき掲示板交流サイトのトップページの新着画像の表示に使っていたスクリプト…。
foreach(glob('cgi/{foo,bar,baz}/src/{*.png,*.jpg}', GLOB_BRACE) as $filename) {
//$arr[$filename] = filemtime($filename);
$arr[$filename] = substr($filename,-17,-4);
}
unset($filename);
//連想配列を値でソート
arsort($arr);
?>
お絵かき掲示板の画像が保存されているディレクトリに入っている画像をすべて呼び出して新着画像順になるようにソート。

以前はファイルのタイムスタンプで並び替えていましたがもしひとつのディレクトリに2000枚の画像があったらディレクトリ3つで合計6000枚。

それを配列にいれるだけでなくサーバにタイムスタンプを問い合わせる処理もはいって…となるのでその処理が負荷になっていました。

それをファイル名でソートするようにすると0.09秒かかっていた処理が0.03秒に短縮。
//$arr[$filename] = filemtime($filename);
$arr[$filename] = substr($filename,-17,-4);
POTI-boardの画像ファイルのファイル名には10桁のユニックスタイムと小数点以下のマイクロタイム3桁分、合計13桁の数字が入っているのでその箇所とりだしてファイル名でソートしても同じ結果を得ることができました。

しかし、表示する画像が新着の1枚でも12枚でもglobでディレクトリ内の画像を検索して6000枚画像があったら配列の数も6000…。

あれ?ログファイルから画像のファイルのパスを取得したら?とひらめいて…。
$i=1;
$fp = fopen($val, "r");
while ($line = fgets($fp ,4096)) {
list($no,,$name,,$sub,,,
,,$ext,,,$time,,,,) = explode(",", $line);
if ($ext){
$dir=explode('/',$val);
$files[]=$no.','.$name.','.$sub.','.$dir[1].',cgi/'.$dir[1].'/src/'.$time.$ext;
// var_dump($val);
if($i>=12){break;}
++$i;
}
}
fclose($fp);
各ディレクトリの新着12枚をもとにして全ディレクトリ分の配列を作成してファイル名でソートすれば…。

12x3=36で配列の数36。

結果処理時間を0.09秒から0.006秒に短縮することができました。

従来の1/15の処理時間でほぼ同じ結果を得ることができました。
いろいろとやってみるものですね。

お絵かき掲示板交流サイトはこちら。