PHP file_exists对我说谎(说文件存在,但它没有)

时间:2012-11-07 18:14:51

标签: php

这样做:

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

其中path是我的linux机器上文件的完整绝对路径。命令返回“1”,即使该文件显然不存在。你可以运行这个命令一百万次,它总会告诉你文件在那里。

运行:

ls path

告诉你没有这样的文件。

是什么给了什么?

更新: 我知道clearstatcache()。在这种情况下,这没有帮助。另外,我正在用cli运行它。从运行到运行没有任何变化。我也在运行ubuntu 11.10的64位虚拟机上运行。

Path只是文件系统上的一个路径:/var/www/yo.txt。 www是一个nfs共享挂载,不确定它是否与它有关。该文件已从远程计算机中删除,但本地计算机似乎知道它不在那里。目录中的“ls”显示没有文件,并且带有路径声明的ls表示该文件不存在。该文件只有几kb,没什么大不了的。

1 个答案:

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