【问题标题】:PHP filemtime function - "stat failed for"PHP filemtime 函数 - “stat 失败”
【发布时间】:2011-10-30 13:14:12
【问题描述】:

我遇到了 PHP filemtime 函数的问题。在我的 web 应用程序中,我使用带有缓存选项的 Smarty 模板引擎。在我的 webapp 中,我可以执行一些会产生错误的操作,但我们只关注一个操作。当我点击页面上的链接时,一些内容会更新 - 我可以点击几次,一切都很好,但是关于 10 的一个请求失败。出现以下错误:

filemtime() [<a href='function.filemtime'>function.filemtime</a>]: stat failed for

以及导致问题的行:

 return ($_template->getCachedFilepath() && file_exists($_template->getCachedFilepath())) ? filemtime($_template->getCachedFilepath()) : false ;

如您所见,文件存在是因为已检查。

有问题的代码行包含在smarty_internal_cacheresource_file.php(Smarty lib v3.0.6 的一部分)中

应用在 UNIX 系统上运行,外部托管。

有什么想法吗?我应该发布更多详细信息吗?

【问题讨论】:

  • 请注意:父目录是否可读?

标签: php unix smarty


【解决方案1】:

用途:

Smarty::muteExpectedErrors();

阅读thisthis

【讨论】:

    【解决方案2】:

    多年来,我成功地使用了 filemtime,而没有检查“file_exists”。我一直解释文档的方式是在任何错误时都应该从“filemtime”返回 FALSE。然后几天前发生了一件非常奇怪的事情。如果该文件不存在,我的 Cron 作业会以结果终止。结果不在程序输出中,而是在 Cron 输出中。消息是“超出文件长度”。我知道 Cron 工作在 filemtime 声明中结束,因为我在该声明之前和之后给自己发了一封电子邮件。 “之后”的电子邮件从未到达。

    我在文件上插入了 file_exists 检查以修复 Cron 作业。但是,这不应该是必要的。我仍然不知道我使用的托管服务器上发生了什么变化。同一天,其他几个 Cron 作业开始失败。我还不知道他们是否与 filemtime 有任何关系。

    【讨论】:

      【解决方案3】:

      file_exists 内部使用access 系统调用,它以真实 用户的身份检查权限,而filemtime 使用stat,它作为有效 用户执行检查em> 用户。因此,问题的根源可能在于有效用户==真实用户的假设,这个假设不成立。另一种解释是文件在两次调用之间被删除。

      既然$_template-&gt;getCachedFilepath() 的结果和文件的存在都可以在系统调用之间改变,你为什么要调用file_exists?相反,我建议只是

      return @filemtime($_template->getCachedFilepath());
      

      如果可以将$_template-&gt;getCachedFilepath() 设置为false 等虚拟值,请使用以下命令:

      $path = $_template->getCachedFilepath();
      if (!$path) return false;
      return @filemtime($path);
      

      【讨论】:

      • 我知道文件可能会在两次调用之间消失,但​​我只是测试此应用程序的人。我也只为一个用户测试它,这就是为什么它对我来说很奇怪。我可以通过输入@符号来忽略错误,但问题不会消失。
      • 我不喜欢包含错误抑制的解决方案,但 +1 表示有效/真实的注释。 @marchewa 检查文件的权限。
      • 所有缓存文件的权限都是0644(rw-r--r--)。我的脚本创建、删除并尝试读取这些文件。正如我所说,只有大约 10% 的请求失败。
      • @Darhazer 如果预期会出现错误,那么错误抑制有什么问题?除非你能保证状态不会改变,否则它肯定比先查看好。
      • @marchewa 如果问题只是间歇性出现,很可能是在您调用file_exists 之后但在filemtime 之前删除了临时文件。您能否通过两次调用filemtime 重现该问题,即使用(@filemtime(..) !== false) 而不是file_exists
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      相关资源
      最近更新 更多