2012-02-09 181 views
4

此问题已被多次询问,但我找到的答案都没有帮助我。即使文件存在于我的linux上,php file_exists也会返回false

我试图让PHP的file_exists()工作。当它工作时唯一的场景是当php文件与文件位于相同的目录中,并且仅使用文件名(即不包括路径)时使用file_exist()。但这不是随之而来的行为,请参阅下文。

索姆信息:

  • 的safe_mode =关闭
  • 没有符号链接的目录28
  • 在文件名中没有空格
  • 在/ var中的所有目录/ www/html等/中芯/上传/ 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等/中芯/模块/核心/票务

的PHP脚本的权限并且要检查的文件是apache:apache 777.

有关目录结构的一些细节:

[[email protected] 28]# pwd 
/var/www/html/smic/upload/28 

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

[[email protected] 28]# chmod 777 ul.txt 

[[email protected] 28]# ls -l ul.txt 
-rwxrwxrwx. 1 apache apache 2 Feb 9 10:50 ul.txt 

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

用于测试,我也感动了实际的PHP脚本/ 28,给了它阿帕奇:阿帕奇777 - 瑞。将$文件改为“ul.txt”(即$ file ='ul.txt';)。这工作,找到ul.txt文件。

GETCWD()打印,然后在/ var/www/html等/中芯/上传/ 28

至于另一项测试我试图找到排除在“准考证”目录的路径,另一个文件,该文件是无法识别。

我砰的一声......

任何意见是赞赏。

+0

你使用哪个版本的php?你没有使用'file://'方案试试吗? – VolkerK 2012-02-09 14:00:32

+0

PHP 5.3,已添加到我的文章。我几乎只尝试没有文件:// – Nicsoft 2012-02-09 14:50:56

回答

2

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

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

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

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

0

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

而且,“这个功能,由于安全模式的限制返回FALSE为不可访问的文件,但这些文件还可以包含,如果它们位于safe_mode_include_dir。”你不是在php安全模式下运行吗? phpinfo()应该告诉你。

+0

根据我的文章,我没有使用safe_mode。 – Nicsoft 2012-02-09 14:19:58

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 
+0

我确保权限是apache:apache 777,用于包括所有子目录upp,并包括/ 28 – Nicsoft 2012-02-09 14:57:00

0

哪里是你的PHP文件在什么位置?如果“HTML”文件夹中,然后使用像$file = "smic/upload/28/ul.txt";

+0

我包含这一行:getcwd()打印/ var/www/html/smic/modules/core/ticket – Nicsoft 2012-02-09 14:13:58

+0

在这种情况下,试试'$ file =“../../../ upload/28/ul.txt”;' – James 2012-02-09 17:28:28

+0

它实际上已经解决了,请参阅我自己的答案。该文件已损坏,我必须使用十六进制编辑器来修复它以去除奇怪的字符。不管怎么说,还是要谢谢你! – Nicsoft 2012-02-09 18:01:47

2

在这里救命稻草的相对路径...

尝试苏 - 阿帕奇(或任何用户你的服务器运行作为..的Apache2,www数据等)。然后遍历目录。

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

+0

apache用户不可用...确认没有.htaccess文件。 – Nicsoft 2012-02-09 14:32:16

+0

此外,我确保许可是apache:apache 777,用于包括/ 28在内的所有子目录。 – Nicsoft 2012-02-09 14:56:06

1

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

+0

我使用这些信息更新了我的帖子。/var/www/html/smic/upload/28 /中的所有目录都具有apache:apache 777作为权限。我刚才改变了。行为没有差异。 – Nicsoft 2012-02-09 14:51:57

+0

这时我不在Linux系统上用PHP。我会在晚上检查一下。所以我不确定,如果这是正确的。如果php脚本在html文件夹中,请尝试“./smic/upload/28/ul.txt”或“smic/upload/28/ul.txt”。 – yen1k 2012-02-09 15:18:32

+0

谢谢,使用十六进制编辑器,我发现奇怪的字符损坏了我的文件。 – Nicsoft 2012-02-09 15:53:11

1

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

+0

不工作(我写了它,但我必须犯了一个错误,因为它不起作用,我可能测试了不正确的脚本,删除了该评论)。 – Nicsoft 2012-02-09 14:43:15

+0

使用__DIR__常数来获取当前目录,使用相对路径后资源 – Userbn 2012-02-09 15:31:16

+0

谢谢,使用十六进制编辑器,我发现了奇怪的字符,它损坏了我的文件。 – Nicsoft 2012-02-09 15:52:42

0

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

+0

你找到答案了吗? – frops 2016-01-22 12:32:42

相关问题