Php is_dir和is_file返回false

Php is_dir和is_file返回false,php,Php,我试图针对特定目录(在我的例子中是/home/gregh/Mail)发出并打开_dir函数,但失败了。当我使用is_dir和is_file检查目录时,它们都返回false(见下文)。我检查了目录和父目录的权限,它们都有775个priv,apache用户甚至拥有与目录所有者相同的组成员资格 print("DEBUG - dir = self::SBD_ROOT_PATH = " . self::SBD_ROOT_PATH . " <P>"); print("DEBUG - is

我试图针对特定目录(在我的例子中是/home/gregh/Mail)发出并打开_dir函数,但失败了。当我使用is_dir和is_file检查目录时,它们都返回false(见下文)。我检查了目录和父目录的权限,它们都有775个priv,apache用户甚至拥有与目录所有者相同的组成员资格

 print("DEBUG - dir = self::SBD_ROOT_PATH = " . self::SBD_ROOT_PATH . " <P>");
 print("DEBUG -   is_dir(self::SBD_ROOT_PATH) = ");
 var_dump(is_dir(self::SBD_ROOT_PATH));
 print("DEBUG -   is_file(self::SBD_ROOT_PATH) = ");
 var_dump(is_file(self::SBD_ROOT_PATH));
以下是一些目录设置信息:

[gregh@proteus ~]$ whoami
gregh
[gregh@proteus ~]$ groups
gregh apache admin
[gregh@proteus ~]$ ls -l /home/gregh

drwxrwxr-x.  6 gregh admin  4096 Mar  1 11:46 Mail
然后我对“apache用户”说:

我还添加了一个检查来查看什么:is_dir(“/home/gregh”)返回和is_dir(“/home”)返回。有趣的是,is_dir(“/home/gregh”)返回FALSE,is_dir(“/home”)返回TRUE


具体来说,为什么“is_dir”函数返回false?这似乎指向某种特权问题,但我不知道它是什么。有什么想法吗?

您要求提供故障排除的想法,因此我想补充以下内容:

clearstatcache();
echo file_exists(self::SBD_ROOT_PATH);
print_r(fstat(self::SBD_ROOT_PATH));
shell_exec('getfacl '.escapeshellarg(self::SBD_ROOT_PATH));
某些版本的Linux上的ACL权限以前对我有所影响,这就是最后一行的内容


另一件需要注意的事情是Apache/PHP必须到达您的目录;如果它至少没有对上面所有目录的“rx”权限,那么它可能无法达到这一程度。

您是否检查了
/home/gregh
的权限?仅仅因为
Mail
是世界可读的,并不意味着apache实际上可以访问它来阅读它。这就像把一个“免费!拿一个!”的箱子放进银行金库。它是免费的,但您无论如何都无法访问它。由于您在函数第一次返回FALSEt后更改了权限,因此您可能需要清除文件状态缓存。'is_dir'缓存其结果。选中此项:调用clearstatcache(),结果相同。关于/home/gregh…的权限,它与/home/gregh/Mail具有相同的所有权/privs。编辑我之前的评论为时已晚,
ls-l
的权限字符串中的尾随点表示您正在运行SELinux,并且该目录具有安全上下文。那是我现在要检查的地方。是塞利努克斯!!!又咬我了。当我构建一个新系统时,我通常会关闭它,然后完全忘记。谢谢你!是的,getfacl会返回组和其他组的所有rwx和rx。奇怪的是,我想我会对“/tmp”尝试一个“is_dir”,结果是真的。但是,如果我在/tmp中创建了一个子目录,它将变为false…即使我在创建的子目录上提供777个priv。哦,fstat不起作用,因为它说我没有目录的特权…我有。fstat不起作用的声音键(
是_dir()
,等等,只是stat的包装而已)。我从评论中看出,这是塞利努克斯;但是如果是这样,为什么不显示它呢?
-bash-4.1$ whoami
apache
-bash-4.1$ groups
apache admin
-bash-4.1$ ls /home/gregh/Mail
7012  7052  email_backup  Errors  float_data  sbd
clearstatcache();
echo file_exists(self::SBD_ROOT_PATH);
print_r(fstat(self::SBD_ROOT_PATH));
shell_exec('getfacl '.escapeshellarg(self::SBD_ROOT_PATH));