Php 缓存代码中的错误

Php 缓存代码中的错误,php,Php,这是我的密码: $cachefile = "cache/ttcache.php"; if(file_exists($cachefile) && ((time() - filemtime($cachefile)) < 900)) { include($cachefile); } else { ob_start(); /*resour

这是我的密码:

      $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();
      }
$cachefile=“cache/ttcache.php”;
如果(file_存在($cachefile)&&((time()-filemtime($cachefile))<900))
{
包括($cachefile);
}
其他的
{
ob_start();
/*输出的资源密集型循环
网站上使用的顶级标签列表*/
$fp=fopen($cachefile,'w');
fwrite($fp,ob_get_contents());
美元(fp);
fclose($fp);
ob_end_flush();
}
这段代码乍一看似乎运行良好,但我发现了一个bug,我不知道如何解决它。基本上,在我将页面单独放置一段时间后,缓存文件会清空(或者,当我刷新页面时,它会清除缓存文件,将其呈现为空白)。然后,条件看到当前空白的缓存文件,将其年龄小于900秒,拉空空白缓存文件的内容代替重新运行循环并重新填充缓存。
if(file_exists($cachefile) && (filesize($cachefile) > 1024) && ((time() - filemtime($cachefile)) < 900))
我在命令行中查看了缓存文件,发现当这个问题存在时,它确实是空白的

我尝试将它设置为60秒,以便更频繁地复制此问题,并希望找到问题的根源,但如果我正在寻找它,它似乎不会复制,只有当我离开页面并在一段时间后返回时


有什么帮助吗?

您可以使用filesize()函数仔细检查文件大小,如果文件太小,就好像缓存是旧的一样


如果文件中没有PHP,出于性能原因,您可能希望使用readfile()将文件吐回给最终用户。

在我编写的缓存例程中,我几乎总是检查文件大小,因为我想确保我没有吐出空数据,因为我依赖bash脚本清除缓存

if(file_exists($cachefile) && (filesize($cachefile) > 1024) && ((time() - filemtime($cachefile)) < 900))
if(file_存在($cachefile)&&(filesize($cachefile)>1024)&((time()-filemtime($cachefile))<900))

这假设您输出的缓存文件大于1024字节,如果它相对较大,通常会大于1024字节。添加一个锁文件也很有用,如上面的注释所述,以避免多个进程试图写入同一个锁文件。

您确定重新呈现页面时不会发生致命错误,并且隐藏在当前的
错误报告()下吗
?在缓存的开头添加一个伪行,如
,以检查当前保存在文件中的内容。您好,很明显您删除了不必要的代码(谢谢!),我们在这里看到的顺序正确吗?特别是在资源密集型部分之后,才使用fopen()打开文件。从目前的情况来看,file_put_contents()似乎是一种更简单的写入文件的方式。我认为解决方法是在读取之前确保文件不是空白的,我如何做到这一点?在写入文件之前尝试锁定文件。可能是多个脚本执行试图写入同一个文件时发生冲突。