这是我的代码:
$cachefile = "cache/ttcache.php";
if(file_exists($cachefile) && ((time() - filemtime($cachefile)) < 900))
{
include($cachefile);
}
else
{
ob_start();
/*resource-intensive loop that outputs
a listing of the top tags used on the website*/
$fp = fopen($cachefile, 'w');
fwrite($fp, ob_get_contents());
fflush($fp);
fclose($fp);
ob_end_flush();
}
这段代码似乎一见钟情,但我发现了一个错误,我无法弄清楚如何解决它。基本上,似乎在我单独离开页面一段时间后,缓存文件清空(或者当我刷新页面时,它清除缓存文件,将其呈现为空白)。然后条件查看现在空白的缓存文件,查看其年龄小于900秒,并拉出空白缓存文件的内容,而不是重新运行循环并重新填充缓存。
我在命令行中捕获了缓存文件,发现当存在此问题时它确实是空白的。
我尝试将其设置为60秒以更频繁地复制此问题,并希望能够找到它的底部,但如果我正在寻找它,它似乎没有复制,只有当我离开页面并在之后返回一会儿。
任何帮助?
答案 0 :(得分:1)
在我编写的缓存例程中,我几乎总是检查文件大小,因为我想确保我没有喷出空白数据,因为我依赖bash脚本来清除缓存。
if(file_exists($cachefile) && (filesize($cachefile) > 1024) && ((time() - filemtime($cachefile)) < 900))
这假设您输出的缓存文件是&gt; 1024字节,通常它会是相对较大的。添加锁定文件也很有用,如上面的注释中所述,以避免多个进程尝试写入同一个锁文件。
答案 1 :(得分:0)
你可以使用filesize()函数仔细检查文件大小,如果它太小,就好像缓存是旧的一样。
如果文件中没有PHP,您可能希望使用readfile()出于性能原因将文件吐回给最终用户。