私は単純なデータベース駆動のPHPウェブサイトを作った。今私はサイトにいくつかの簡単なキャッシングを実装しようとしています。私はどこかでこれを試しましたシンプルなPHPキャッシングでのファイル書き込み中のエラー
<?php
$reqfilename="test";
$cachetime = 60*5; // 5 minutes
$cachefile = "cache/".$reqfilename.".html";
$cf2="cache/".$reqfilename."2.html";
if (file_exists($cachefile) && ((time() - $cachetime) < filemtime($cachefile)))
{
include($cachefile);
exit;
}
ob_start();
?>
CONTENT OF THE PAGE GOES HERE
<?php
$fp = @fopen($cf2, 'w');
if($fp){
fwrite($fp, ob_get_contents());
fclose($fp);
rename($cf2,$cachefile);
}
ob_end_flush();
?>
しかし、キャッシュファイルの名前が変更され、誰かがページを要求した場合はどうなりますか?エラーが表示されるのでしょうか、またはユーザーに遅延が発生しますか?この(以下webbiedaveによって回答に基づいて)を行うための正しいコードをのみ、私は名前を変更使用しています直接ではなく、元のキャッシュファイルに
を書いて変更されたキャッシュファイルの時間を短縮する
<?php
$reqfilename="test";
$cachetime = 60*5; // 5 minutes
$cachefile = "cache/".$reqfilename.".html";
if (file_exists($cachefile) && ((time() - $cachetime) < filemtime($cachefile)))
{
include($cachefile);
exit;
}
ob_start();
?>
CONTENT OF THE PAGE GOES HERE
<?php
$fp = @fopen($cachefile, 'w');
if (flock($fp, LOCK_EX | LOCK_NB)) {
fwrite($fp, ob_get_contents());
flock($fp, LOCK_UN);
fclose($fp);
}
ob_end_flush(); ?>
ありがとうございました。私が探していたことがまさにそれです。以前はLOCK_NBを考えていませんでした。再度、感謝します。 – PRYM