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

时间:2012-02-09 13:42:49

标签: php linux file-upload file-exists

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

我想让php file_exists()工作。它工作的唯一场景是当php文件与使用file_exist()的文件位于同一目录中并且仅使用文件名(即排除路径)时。但这不是后续行为,请参阅下文。

Som信息:

  • 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脚本和要检查的文件的权限是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脚本移动到/ 28,给它apache:apache 777 rigths。将$文件更改为“ul.txt”(即$ file ='ul.txt';)。这工作,找到ul.txt文件。

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

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

我在敲我的脑袋......

任何建议表示赞赏。

8 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

抓住吸管......

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

是否有任何针对您的apache配置的.htaccess文件或任何其他限制?

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

尝试使用$ file ='/ upload / 28 / ul.txt';

打开文件

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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