PHP:is_file()和file_exists()在同一个文件上返回不同的结果

问题描述:

我遇到了file_exists返回false并且is_file返回true的问题。PHP:is_file()和file_exists()在同一个文件上返回不同的结果

echo(getmygid()." = gid\n"); //501 
echo(getmyuid()." = uid\n"); //501 
echo(posix_getgid()." = pgid\n"); //501 
echo(posix_getuid()." = puid\n"); //501 
var_dump(file_exists("/home/www/public_html/")); //bool(true) 
var_dump(file_exists("/home/www/public_html/index.html")); //bool(false) 
var_dump(is_file("/home/www/public_html/index.html")); //bool(true) 

var_dump(stat("/home/www/public_html/index.php")); 

输出是:

501 = gid 
501 = uid 
501 = pgid 
501 = puid 
bool(true) 
bool(false) 
bool(true) 
array(26) { 
    [0]=> 
    int(51712) 
    [1]=> 
    int(58055) 
    [2]=> 
    int(33197) 
    [3]=> 
    int(1) 
    [4]=> 
    int(501) 
    [5]=> 
    int(501) 
    [6]=> 
    int(0) 
    [7]=> 
    int(473) 
    [8]=> 
    int(1323573973) 
    [9]=> 
    int(1323573973) 
    [10]=> 
    int(1323574039) 
    [11]=> 
    int(4096) 
    [12]=> 
    int(8) 
    ["dev"]=> 
    int(51712) 
    ["ino"]=> 
    int(58055) 
    ["mode"]=> 
    int(33197) 
    ["nlink"]=> 
    int(1) 
    ["uid"]=> 
    int(501) 
    ["gid"]=> 
    int(501) 
    ["rdev"]=> 
    int(0) 
    ["size"]=> 
    int(473) 
    ["atime"]=> 
    int(1323573973) 
    ["mtime"]=> 
    int(1323573973) 
    ["ctime"]=> 
    int(1323574039) 
    ["blksize"]=> 
    int(4096) 
    ["blocks"]=> 
    int(8) 
} 

我想我已经做错了什么配置,但还没有完全想通了它是什么。

更令人兴奋的是,尽管file_exists不起作用fread(fopen('/home/www/public_html/index.html','r'), filesize('/home/www/public_html/index.html'))的确会返回文件的内容。

+2

进一步解释你已经发布了错误的文件的统计资料,你能改正这一点? – ajreal

+0

所有这些目录(home,www,public_html)都为此脚本启用了读取权限?他们都是目录,而不是符号链接? –

+0

是的。我的错。只是修正了那个。这是空的。和一个655模式。 – teotwawki

奇怪,这里有几个选项手动检查:

Note: The results of this function are cached. See clearstatcache() for more details. 

或者这也许:

Warning 

该函数返回FALSE的文件无法访问因安全模式限制。但是,如果这些文件位于safe_mode_include_dir中,它们仍然可以包含在内。

这些是我能想到的唯一可能影响它的事情。不知道你是否尝试过,但值得一试。

UPDATE

如何对文件的标志吗?从shell(如果有shell访问权限),你可以做一个ls -alh /home/www/public_html | grep index.html并确保一个标志没有被设置为奇怪吗?

更新2

的问题是,目录的权限分别使业主无法查看目录的内容。这是在意见

+0

根据phpinfo() safe_mode \t off \t off clearstatcache()没有改变结果。 – teotwawki

+0

只是验证,它也不是一个符号链接,对吗? –

+0

正确,它不是符号链接。 – teotwawki

参见file_exists()警告:对于无法访问的文件

该函数返回FALSE由于安全模式的限制。但是,如果这些文件位于safe_mode_include_dir中,则仍然可以包含这些文件。

is_file()函数似乎没有这个限制。