【问题标题】:PHP File include errorPHP文件包含错误
【发布时间】:2012-06-04 19:36:49
【问题描述】:

我在 PHP 页面中有以下代码。有时当我删除 cache2.html 文件时,我希望 php 重新创建它,并且下一个人将获得 cache2.html 而不是执行 php 代码。我有时在页面上收到以下警告,但没有内容。是因为多个用户同时访问php吗?如果是这样,我该如何解决?谢谢。

警告:include(dir1/cache2.html) [function.include]:未能 打开流:中没有这样的文件或目录 /home/content/54/site/index.php 在第 8 行

<?php 
if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start();

$cachefile = "dir1/cache2.html";
if (file_exists($cachefile)) {
        include($cachefile); // output the contents of the cache file
} else {

/* HTML (BUILT USING PHP/MYSQL) */

$cachefile = "dir1/cache2.html";
$fp = fopen($cachefile, 'w'); 
fwrite($fp, ob_get_contents()); 
fclose($fp);
ob_flush(); // Send the output to the browser
}  
?>

【问题讨论】:

  • 修复它的一种方法是在有人访问页面时不删除文件。这听起来不像是一个巨魔答案,但尝试做听起来像你想做的事情需要更多的复杂性,并且知道你是否需要它很重要。
  • 那是我为避免每个请求调用数据库而构建的缓存。我清楚每次我的网站内容发生变化(每隔一小时左右发生一次)。我还需要哪些其他选项来实现此缓存?
  • 您的缓存解决方案还不错,只是错误处理有待改进。我喜欢 AlexHowansky 下面的第二个建议。

标签: php


【解决方案1】:

对 file_exists() 的调用本身会被缓存,因此即使在文件被删除之后,您也可能会获得 true 的返回值。见:

http://us.php.net/manual/en/function.clearstatcache.php

所以,你可以这样做:

clearstatcache();
if (file_exists($cache)) {
    include($cache);
} else {
    // generate page
}

或者,您可以这样做:

if (file_exists($cache) && @include($cache)) {
    exit;
} else {
    // generate page
}

或者更好的是,如果您要从 PHP 进程中删除缓存文件,则只需在删除文件后调用 clearstatcache()。

【讨论】:

  • 我更喜欢第二种方法,因为它可以捕获(可能是边缘)文件在存在和包含之间被删除的情况。在第二种情况下,如果包含失败(即使它刚刚存在),仍然会生成页面。
  • 那个@是我不喜欢的东西。你可以试试 try/catch,这样会更优雅。
  • 失败的包含不抛出异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 2011-05-27
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多