PHP filemtime函数 - “stat failed for”

时间:2011-08-19 11:18:09

标签: php unix smarty

我有一个PHP filemtime函数的问题。在我的webapp中,我使用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的一部分)

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

有什么想法吗?我应该发布更多细节吗?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

使用:

Smarty::muteExpectedErrors();

阅读thisthis

答案 2 :(得分:0)

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

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