2011-08-19 75 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

相關問題