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无法访问,其他文件可以执行和读取。
如何解决这个问题?
答案 0 :(得分:8)
请注意,如果父目录没有为运行php文件的用户设置is_file()
(运行权限),+x
将返回 false 。
这是有道理的,但readdir()
等其他功能似乎没有这个限制。最终结果是您可以遍历目录的文件,但is_file()
将始终失败。
引自here
答案 1 :(得分:1)
请注意,www-data或web服务器用户必须拥有访问目录的权限,而文件是,以webserver用户身份登录(su中的www-data)并检查您是否可以通过所有路径访问用来访问该文件。
答案 2 :(得分:0)
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
手动复制文件。