is_dir和is_file都返回false

时间:2014-03-02 04:28:26

标签: php

我正在尝试针对特定目录(在我的情况下为/ home / gregh / Mail)发出open_dir函数,但它失败了。当我使用is_dir和is_file检查目录时,它们都返回false(见下文)。我检查了目录和父目录的权限,并且都有775个privs,而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));

这会产生以下输出:

 DEBUG - dir = self::SBD_ROOT_PATH = /home/gregh/Mail
 DEBUG - is_dir(self::SBD_ROOT_PATH) = bool(false)
 DEBUG - is_file(self::SBD_ROOT_PATH) = bool(false)

以下是一些目录设置信息:

[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

然后我sudo到“apache用户”:

-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

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

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

1 个答案:

答案 0 :(得分:0)

您要求提供故障排除提示,因此这些是我要添加的内容:

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'的权限,那么它可能不会那么远吗?