2012-11-07 67 views
2

這樣做:PHP file_exists是在騙我(說文件存在,但它不)

php -r 'unlink("path"); clearstatcache(); echo file_exists("path");' 

其中path是我的Linux機器上的文件的完整絕對路徑。即使文件顯然不存在,命令也會返回'1'。你可以運行這個命令一百萬次,它會一直告訴你這個文件在那裏。

運行:

ls path 

告訴你有沒有這樣的文件。

是什麼給出的?

更新: 我知道關於clearstatcache()。這在這種情況下沒有幫助。另外,我用cli來運行它。從運行到運行沒有任何變化。我也在運行ubuntu 11.10的64位虛擬機上運行。

路徑只是文件系統上的路徑:/var/www/yo.txt。 www是一個nfs共享掛載,不確定是否與它有關。該文件已從遠程機器中刪除,但本地機器似乎知道它不在那裏。目錄上的'ls'不顯示任何文件,ls和path聲明表示文件不存在。該文件只是幾kb,沒什麼大的。

+1

本文檔提到了有關32位系統上較大文件(> 2GB)的不穩定行爲的問題。這可能是你所看到的嗎? – Lix

+2

*「什麼給?」* - 閱讀手冊*可能*幫助。 http://php.net/clearstatcache – hakre

+3

@hakre,是否**你**繼續閱讀? 'unlink()'*自動清除緩存*。 –

回答

1

PHP正在說出它知道的事實。罪魁禍首是NFS屬性緩存。您可以整天撥打clearstatcache,不起作用:NFS負責。

我探索發生了什麼in another SO answer,但簡短的回答是這樣的:調整你的NFS掛載選項,讓您更快的答案(試行noac),或使用opendir()closedir()無效的NFS緩存然後調用clearstatcache(),如:

php -r 'unlink("path"); $d = dirname("path"); opendir($d); closedir($d); clearstatcache(); echo file_exists("path");' 
相關問題