php is_file总是返回false

时间:2012-08-29 08:36:23

标签: php

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 个答案:

答案 0 :(得分:8)

请注意,如果父目录没有为运行php文件的用户设置is_file()(运行权限),+x将返回 false

这是有道理的,但readdir()等其他功能似乎没有这个限制。最终结果是您可以遍历目录的文件,但is_file()将始终失败。

引自here

答案 1 :(得分:1)

请注意,www-data或web服务器用户必须拥有访问目录的权限,而文件是,以webserver用户身份登录(su中的www-data)并检查您是否可以通过所有路径访问用来访问该文件。

答案 2 :(得分:0)

如果文件为regular file

is_file()会返回。

  

当你执行ls -l时,如果文件权限的第一列是a    - ,然后该文件是常规文件。

所以使用file_exists()函数。如果存在文件/目录,则返回。

答案 3 :(得分:0)

你也可以使用!is_dir,它不会遇到运行权限问题。

if(!is_dir($filename)) {
  //remove a file
  unlink($filename);
} else {
  //remove a directory
}

答案 4 :(得分:0)

我有同样的问题。问题是文件路径不正确。

请务必确保is_file($dir.$file)指向正确的位置。

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

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

答案 5 :(得分:0)

通常,请根据以前的答案检查文件权限。

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