PHP file_exists() 在某些文件上返回 false

Posted

技术标签:

【中文标题】PHP file_exists() 在某些文件上返回 false【英文标题】:PHP file_exists() returning false on some files 【发布时间】:2011-06-05 19:24:33 【问题描述】:

我在 Linux 服务器上的 file_exists() php 函数遇到了一个奇怪的问题。

在编辑之前使用 file_exists 检查图像是否在服务器上时,有时会无缘无故地失败。文件路径是绝对的,我已经通过 ssh 检查它们在指定路径上是 100%。

file_exists() 失败的图像仍将显示在浏览器中。代码没有区别,基本的var_dump(file_exists('/home/user/path/image.jpg')); 将返回 false。

所有图像和父目录的文件权限/所有权完全相同。安全模式已关闭。没有 PHP 错误。我现在很困惑,不知道要寻找什么。

这是图像在服务器上的样子:

/home/user/public_html/images/location/1.jpg -- will work
/home/user/public_html/images/location2/1.jpg -- won't work
/home/user/public_html/images/location2/2.jpg -- will work

我对服务器有 root 访问权限,所以如果有人有任何想法,我会很乐意尝试一下。

提前感谢您的建议,如果您需要更多信息,请告诉我。

编辑: 回答下面cmets中的问题。

是的,图像在那里,绝对没有缓存。 安全模式已关闭(我已经在我的帖子中提到了这一点)。 路径不是符号链接,而是指向服务器上文件位置的直接链接。 凤凰,是一致的。工作文件将始终有效,反之亦然。名称是 1.jpg、1.thumb.jpg 等,所以奇怪的字符或空格都不是问题。
[root@server ~]# ls -l /home/user/public_html/images/Hawkhurst/
total 92
-rwxr-xr-x  1 user user 24501 Aug 11  2009 1.jpg
-rwxr-xr-x  1 user user  1672 Aug 11  2009 1.thumb.jpg
-rwxr-xr-x  1 user user 14983 Aug 11  2009 2.jpg
-rwxr-xr-x  1 user user  1370 Aug 11  2009 2.thumb.jpg
-rwxr-xr-x  1 user user 17238 Aug 11  2009 3.jpg
-rwxr-xr-x  1 user user  1453 Aug 11  2009 3.thumb.jpg
-rwxr-xr-x  1 user user 14168 Aug 11  2009 4.jpg
-rwxr-xr-x  1 user user  1464 Aug 11  2009 4.thumb.jpg 
[root@server ~]#

我已尝试使用权限 777 和 755,这没有区别。例如在这个文件夹中,1 和 2 可能会起作用,而 3 和 4 则不会...

我进行了一个快速测试以查看 apache/php 的运行方式以及它们确实以无人身份运行,但这并不能解释为什么有些图像可以工作,而有些则不能具有完全相同的权限。

编辑 2: 问题已解决。简直不敢相信这是多么愚蠢,从数据库调用的一些文件名末尾有空格......制作原始脚本的人在保存它们之前没有运行任何清理。

【问题讨论】:

文件真的存在吗?由于缓存,您可能会看到图像。 您是否启用了安全模式? This function will return FALSE for symlinks pointing to non-existing files. 几个问题:在您的示例中,不显示为存在的文件是否总是在每次运行脚本时都不会显示,还是间歇性问题?什么是不起作用的文件的实际文件名示例? 谢谢@ben,这真的帮助了我(我不得不遇到同样愚蠢的问题!)。我责怪php。 【参考方案1】:

尝试运行 ls -l /home/user/public_html/images/location/ 并将输出添加到您的问题中。

这很可能是权限问题。 PHP 可能没有对该文件的读取权限。

【讨论】:

如果您在 Apache HTTPd Web 服务器上运行 PHP,请注意通常 apache 以 daemon 用户身份运行。检查该特定用户是否具有所需的权限。【参考方案2】:

在网上大量搜索后,我自己找到了解决方案。希望对其他人有帮助: 确保你的 apache httpd.conf 中配置的 User 和 Group 和 apache 的 group 和 user 一样。

【讨论】:

【参考方案3】:

也许,在文件名中有一个空格符号。这很重要。

【讨论】:

【参考方案4】:

我也无法获得正确的结果。 事实证明,这对我来说是文件夹上的权限问题。 您必须确保文件夹具有 Apache 用户的执行权限。 为了修复它,我只是在我的 linux-box 上做了这个: chmod g+x csv_files

亲切的问候 伊万

【讨论】:

以上是关于PHP file_exists() 在某些文件上返回 false的主要内容,如果未能解决你的问题,请参考以下文章

File_exists 对某些文件失败

PHP - file_exists 还是数组缓存?

php file_exists 在文件被复制、创建或上传时

非常奇怪的 PHP file_exists 问题

file_exists() 在 while 循环内的 php5 中不起作用

PHP file_exists 内容而不是名称?