PHP的is_file函数总是返回false

5

php的is_file函数总是返回false

[apache@h185 default]$ ls -l /home/www/default/p.php
-rwxr-xr-x. 1 zhouhh zhouhh 50837 Aug 28 19:02 /home/www/default/p.php
[apache@h185 default]$ ls -l /usr/bin/rrdtool
-rwxr-xr-x. 1 root root 24688 Aug 21  2010 /usr/bin/rrdtool
[apache@h185 default]$ ls -l /root/my.cnf
ls: cannot access /root/my.cnf: Permission denied
[apache@h185 default]$ ls -l /usr/bin/ld
-rwxr-xr-x. 1 root root 594968 Jun 22 22:06 /usr/bin/ld
[apache@h185 default]$ ls -l /usr/bin/php
-rwxr-xr-x. 1 root root 3224944 Jul  4 00:57 /usr/bin/php
[apache@h185 default]$ vi test.php
[apache@h185 default]$ cat test.php
<?php
#if(is_file('/home/www/default/p.php'))

#if(is_file('/usr/bin/rrdtool'))
#if(is_file('/root/my.cnf'))
#if(is_file('/usr/bin/ld'))
#if(file_exists('/usr/bin/ld'))
if(is_file('/usr/bin/php'))
{
print 'ok';
}
else
{
print 'no ok';
}
?>
[apache@h185 default]$

除了第一行返回true,其他行始终返回false。但是这个文件都存在。 /root/my.cnf无法访问,其他文件可以执行和读取。

如何解决这个问题?


6
为什么不直接使用 file_exists() 函数? - HerpaMoTeH
为什么不尝试使用http://php.net/manual/en/function.file-exists.php? - user1317647
7个回答

10
请注意,如果父目录对于运行 PHP 文件的用户没有设置可执行权限(+x),则 is_file() 函数将返回 false
这是有道理的,但是其他函数(如 readdir())似乎没有这个限制。结果就是你可以遍历目录中的文件,但是 is_file() 总是会失败。
引用自 这里

谢谢,帮了大忙。 - Hannes Schneidermayer
当我遇到这个问题时,我来到了这个页面。我尝试了所有的答案,但都没有起作用。后来我发现了那个评论,所以我把它复制到这里,以便其他人到达这个页面时可以参考。我真的不明白这是什么问题,这意味着答案不够有帮助吗? - Kuf
谢谢!这帮助我解决了 Laravel SSH 无法获取密钥的问题。 - Alexander Traikov

2
请注意,www-data或Web服务器用户必须具有访问文件所在目录的权限。请以Web服务器用户身份登录(在Linux中使用su www-data命令),并检查您是否可以通过用于访问该文件的所有路径进行访问。

1
您也可以使用!is_dir,它不会受到运行权限问题的影响。
if(!is_dir($filename)) {
  //remove a file
  unlink($filename);
} else {
  //remove a directory
}

0

我曾经遇到过同样的问题。问题出在文件路径不正确。

一定要确保例如is_file($dir.$file)指向正确的位置。

通过以下方式输出您最近的位置:var_dump($dir.$file);

输出是否设置了正确的文件路径(必须为true):var_dump(is_file($dir.$file));


0

is_file() 函数返回一个文件是否为 普通文件

当你执行 ls -l 命令时,如果文件权限的第一栏是一个 -,那么这个文件就是一个普通文件。

因此,请使用 file_exists() 函数。它返回一个文件/目录是否存在。


0

通常情况下,请根据之前的答案检查您的文件权限。

在Docker构建环境中,由于主机:容器目录映射而复制的文件可能没有正确复制。如果您看到文件权限为-??????????,请使用docker cp手动复制文件。


0
我知道这是老问题了,但在我的情况下,我从一个文件中获取我的文件名,并将其按换行符分割。在我的文件名末尾添加trim()函数来去除隐藏字符解决了我的问题。显然,文件名中添加的隐藏符号不会自动解析出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接