即使我的 linux 上存在文件,php file_exists 也会返回 false

Posted

技术标签:

【中文标题】即使我的 linux 上存在文件,php file_exists 也会返回 false【英文标题】:php file_exists is returning false even if file exist on my linux 【发布时间】:2012-03-01 23:40:41 【问题描述】:

这个问题已被问过很多次,但我找到的答案都没有帮助我。

我正在尝试让 php file_exists() 工作。唯一可行的情况是当 php 文件与要使用 file_exist() 的文件位于同一目录中并且仅使用文件名(即不包括路径)时。但这不是随之而来的行为,请参见下文。

索姆信息:

safe_mode=off 目录 28 没有符号链接 文件名中没有空格 /var/www/html/smic/upload/28/ 中的所有目录都具有 apache:apache 777 作为权限。 使用 php 5.3

PHP:

echo getcwd()
clearstatcache();
$file = 'file:///var/www/html/smic/upload/28/ul.txt';
//Also tried like this
//$file = '/var/www/html/smic/upload/28/ul.txt';

if(file_exists($file))
    echo $file." exists";

getcwd() 打印 /var/www/html/smic/modules/core/ticket

php-script的权限和要检查的文件是apache:apache 777。

目录结构的一些细节:

[root@localhost 28]# pwd
/var/www/html/smic/upload/28

[root@localhost 28]# ls -l ul.txt
-rw-r--r--. 1 apache apache 2 Feb  9 10:50 ul.txt

[root@localhost 28]# chmod 777 ul.txt

[root@localhost 28]# ls -l ul.txt
-rwxrwxrwx. 1 apache apache 2 Feb  9 10:50 ul.txt

更改文件的权限后行为没有改变。目录 /28 有 drwxr-xr-x。对于 apache 用户和 apache 组

为了测试,我还将实际的 php-script 移动到 /28,给它 apache:apache 777 rigths。将 $file 更改为“ul.txt”(即 $file = 'ul.txt';)。这行得通,找到了 ul.txt 文件。

getcwd() 然后打印 /var/www/html/smic/upload/28

作为另一项测试,我试图在“ticket”目录中查找不包括路径的另一个文件,但该文件无法识别。

我在敲我的头......

感谢任何建议。

【问题讨论】:

你用的是哪个版本的php?你试过没有file:// 方案吗? PHP 5.3,已添加到我的帖子中。我几乎只尝试过没有 file:// 【参考方案1】:

仅文件的权限不足以让php评估file_exists。运行 php 的进程也需要权限才能遍历该文件的所有父目录才能访问它。

一一核对,验证php可以读取和输入(r-x)

ls -ald /var
ls -ald /var/www
ls -ald /var/www/html
ls -ald /var/www/html/smic
ls -ald /var/www/html/smic/upload
ls -ald /var/www/html/smic/upload/28

【讨论】:

我确保所有子目录的权限都是 apache:apache 777,包括 /28【参考方案2】:

在这里抓着稻草......

尝试 su - apache(或任何您的网络服务器运行的用户......apache2、www-data 等),然后遍历目录。

是否有任何 .htaccess 文件在敲门,或者对您的 apache 配置有任何其他限制?

【讨论】:

apache 用户不可用...已验证无论如何都没有 .htaccess 文件。 另外,我确保所有子目录的权限都是 apache:apache 777,包括 /28。【参考方案3】:

哎呀,这是一个漂亮的凝灰岩。我总是确保当我从网上复制任何内容时,首先将其粘贴到普通的文本编辑器中,以删除所有奇怪/隐藏的字符,然后再次复制任何内容并将其粘贴到我的开发工具中。

正如我在评论中提到的那样,我做了 pwd 并将文本从我的虚拟服务器复制到我的 osx。但是我没有想到/知道的是,如果我从我的 linux 服务器上执行此操作,可能会出现奇怪/隐藏的字符,因此我没有确保通过 texteditor 复制所有内容。

我记得很久以前我从网上复制时遇到了问题,并认为这可能是类似的问题。我在十六进制编辑器中打开了我的脚本。我发现了什么……'/var' 看起来很简单:'/var'。删除奇怪的字符解决了这个问题。

感谢大家的上述cmets。希望那些可以帮助别人,也许它甚至在不知不觉中帮助了我(因为我根据你的 cmets 做了很多事情)。

【讨论】:

【参考方案4】:

文件夹的访问权限如何? 路径$file = 'file:///var/www/html/smic/upload/28/ul.txt'; 不正确。 尝试将 php 脚本复制到文件夹上传和file='28/ul.txt';。 该文件夹必须是可读的。

【讨论】:

我用这些信息更新了我的帖子。 /var/www/html/smic/upload/28/ 中的所有目录都具有 apache:apache 777 作为权限。我刚才改变了。行为上没有区别。 我现在不在使用 PHP 的 Linux 系统上。我会在晚上检查它。所以我不确定这是否正确。如果 php 脚本在文件夹 html 中,请尝试“./smic/upload/28/ul.txt”或“smic/upload/28/ul.txt”。 谢谢,我使用十六进制编辑器发现了损坏文件的奇怪字符。 所以文件损坏了?另一个你可以检查/打开的文件? 我通过删除十六进制编辑器中的奇怪字符来修复文件(php 脚本)。然后它起作用了。在此处某处查看我自己的答案。【参考方案5】:

尝试使用$file = '/upload/28/ul.txt'打开文件;

【讨论】:

不起作用(我写了它,但我一定犯了一个错误,因为它不起作用,我可能测试了不正确的脚本,删除了该评论)。 使用 DIR 常量获取当前目录,使用资源的相对路径后 谢谢,我使用十六进制编辑器发现了损坏文件的奇怪字符。【参考方案6】:

来自 php.net 手册,“失败时,会发出 E_WARNING。”确保错误报告设置为会显示警告的级别并尝试一下。

此外,“对于由于安全模式限制而无法访问的文件,此函数返回 FALSE。但是,如果这些文件位于 safe_mode_include_dir 中,它们仍然可以包含在内。”。你不是在php安全模式下运行吗? phpinfo() 应该会告诉你。

【讨论】:

根据我的帖子,我没有使用安全模式。【参考方案7】:

您的 php 文件在哪里?如果在“html”文件夹中,则使用相对路径,如 $file = "smic/upload/28/ul.txt";

【讨论】:

我为此添加了这一行:getcwd() prints /var/www/html/smic/modules/core/ticket 在这种情况下,试试$file = "../../../upload/28/ul.txt"; 其实已经解决了,看我自己的回答。该文件已损坏,我不得不使用十六进制编辑器修复它以删除奇怪的字符。还是谢谢!【参考方案8】:

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

【讨论】:

你找到答案了吗?

以上是关于即使我的 linux 上存在文件,php file_exists 也会返回 false的主要内容,如果未能解决你的问题,请参考以下文章

PHP file_exists 对现有文件返回 false

文件存在检查 php 的 auto_prepend_file

PHP 无法找到文件,即使它存在

如何检查文件是不是存在没有PHP中的扩展名?

即使使用 FILE_FLAG_DELETE_ON_CLOSE 属性创建文件,文件也会留在磁盘上

PYTHON FLASK - request.files 显示为文件未找到,即使它存在