5

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

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

索姆资料:

  • 安全模式=关闭
  • 目录 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”目录中找到不包括路径的另一个文件,该文件无法识别。

我在敲我的头...

任何建议表示赞赏。

4

8 回答 8

9

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

一一检查,验证php可以读取和输入(rx)

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
于 2012-02-09T13:53:13.853 回答
2

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

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

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

谢谢大家在上面的评论。希望那些可以帮助其他人,也许它甚至在不知不觉中帮助了我(因为我根据您的评论做了很多事情)。

于 2012-02-09T15:49:53.117 回答
2

在这里抓着稻草...

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

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

于 2012-02-09T13:54:00.377 回答
1

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

于 2012-02-09T14:09:00.537 回答
1

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

于 2012-02-09T13:56:16.400 回答
0

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

于 2014-09-22T13:45:18.813 回答
0

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

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

于 2012-02-09T13:47:50.053 回答
0

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

于 2012-02-09T13:53:21.200 回答