2011-08-19 238 views
8

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

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系统中,外部主机上运行。

任何想法?我应该发布更多细节吗?

+0

刚一说明:是的父目录可读? –

+0

是的,它是可读的 – lbednaszynski

回答

10

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

由于$_template->getCachedFilepath()的结果和文件的存在可能会在系统调用之间发生变化,您为什么根本不需要调用file_exists?相反,我建议刚

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

如果$_template->getCachedFilepath()可以设置为虚值,如false,使用以下命令:

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

我知道这个文件可以在两次调用之间消失,但​​我只是一个测试这个应用程序的人。我也测试它只为一个用户这就是为什么它对我来说很奇怪。我可以通过放@符号来忽略错误,但问题不会消失。 – lbednaszynski

+1

我不喜欢包含错误抑制的解决方案,但对有效/真实音符为+1。 @marchewa检查文件的权限。 –

+0

所有缓存文件的权限都是0644(rw-r - r--)。我的脚本创建,删除并尝试读取这些文件。正如我所说的,只有约10%的请求失败。 – lbednaszynski

0

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

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

2

用途:

Smarty::muteExpectedErrors(); 

阅读thisthis