【问题标题】:PHP file_exists is lying to me (saying file exists but it doesnt)PHP file_exists 在骗我(说文件存在但它不存在)
【发布时间】:2017-01-19 01:05:07
【问题描述】:

这样做:

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

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

跑步:

ls path

告诉你没有这样的文件。

什么给了?

更新: 我知道 clearstatcache()。在这种情况下,这无济于事。此外,我正在使用 cli 运行它。从运行到运行没有任何变化。我也在运行 ubuntu 11.10 的 64 位 VM 上。

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

【问题讨论】:

  • 文档提到了在 32 位系统上较大文件 (>2GB) 的不稳定行为。这可能是您所看到的吗?
  • "what give?" - 阅读手册可能有帮助。 php.net/clearstatcache
  • @hakre,继续阅读了吗? unlink() 自动清除缓存.
  • 查看本文档页面的第一条评论 -> php.net/manual/en/function.clearstatcache.php
  • 告诉我们更多关于 path 的信息?是本地文件吗?它是如何创建的?它的权限是什么?

标签: php


【解决方案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");'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2016-01-13
    • 2013-09-06
    • 2014-03-14
    相关资源
    最近更新 更多