我的缓存代码中的错误

时间:2011-04-14 21:14:20

标签: php

这是我的代码:

      $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秒以更频繁地复制此问题,并希望能够找到它的底部,但如果我正在寻找它,它似乎没有复制,只有当我离开页面并在之后返回一会儿。

任何帮助?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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