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 不能访问,其他文件可以执行和读取。

如何解决这个问题呢?

4

6 回答 6

10

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

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

从这里引用

于 2012-08-29T08:40:57.730 回答
1

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

于 2014-02-08T23:42:38.050 回答
1

您还可以使用不受运行权限问题影响的 !is_dir 。

if(!is_dir($filename)) {
  //remove a file
  unlink($filename);
} else {
  //remove a directory
}
于 2018-03-20T11:58:21.213 回答
0

is_file()如果文件是常规文件则返回。

当您执行 ls -l 如果文件权限的第一列是 - 时,则该文件是常规文件。

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

于 2012-08-29T08:43:33.767 回答
0

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

始终确保 egis_file($dir.$file)指向正确的位置。

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

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

于 2019-07-24T08:14:29.170 回答
0

作为一般规则,请根据先前的答案检查您的文件权限。

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

于 2020-01-28T23:16:11.487 回答