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

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

我正在试图让php file_exists()工作。 当它工作的唯一情况是当php文件是在文件相同的目录中使用file_exist()和只使用文件名(即不包括path)。 但这不是随之而来的行为,请看下面。

索姆信息:

  • safe_mode设置=关
  • 目录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脚本的权限和要检查的文件是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组

为了testing,我也把实际的php脚本移到了/ 28,给了它apache:apache 777 rigths。 将$文件更改为“ul.txt”(即$ file ='ul.txt';)。 这工作,findul.txt文件。

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

作为另一个testing,我试图find另一个文件,不包括“ticket”目录中的path,文件不被识别。

我正在敲我的头

任何意见表示赞赏。

单独的文件许可不足以让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 

抓在这里的秸秆…

尝试苏 – 阿帕奇(或无论你的网络服务器运行的用户.. Apache2,万维网数据等..),然后遍历目录。

是否有任何.htaccess文件,或您的Apache配置上的任何其他限制?

哎,这是一个非常凝灰岩的。 我总是确保当我从网上复制任何东西,首先粘贴到一个正常的texteditor为了删除所有奇怪的/隐藏的字符,然后复制什么,并粘贴到我的开发工具。

正如我在评论中提到的,我做了pwd,并将我的虚拟服务器的文本复制到我的osx。 但是,我没有想到/知道的是,如果我从我的Linux服务器上做到这一点,奇怪的/隐藏的字符可以遵循,因此我没有确保通过texteditor复制所有的东西。

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

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

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

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

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

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

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

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