【问题标题】:PHP:is_file() and file_exists() return different results on same filePHP:is_file() 和 file_exists() 在同一个文件上返回不同的结果
【发布时间】:2012-01-17 16:20:01
【问题描述】:

我遇到了 file_exists 返回 false 而 is_file 返回 true 的问题。

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')) 确实返回了文件的内容。

【问题讨论】:

  • 您在错误的文件中发布了统计信息,您能更正吗?
  • 所有这些目录(home、www、public_html)都为这个脚本启用了读取权限?它们都是目录,而不是符号链接吗?
  • 是的。我的错。刚刚解决了这个问题。这是空的。和 655 模式。
  • 没有符号链接。主目录是 766 www 是 drwxrwxr-x public_html 是 drw-r-xr-x
  • stat是index.php的,是php还是html?

标签: php file-exists


【解决方案1】:

查看file_exists()上的警告:

此函数返回FALSE 用于由于安全模式限制而无法访问的文件。但是,如果这些文件位于 safe_mode_include_dir 中,仍然可以包含这些文件。

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

【讨论】:

    【解决方案2】:

    很奇怪,这里有几个选项可以从手册中查看:

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

    或者这个可能:

    Warning
    

    对于由于安全模式限制而无法访问的文件,此函数返回 FALSE。但是,如果这些文件位于 safe_mode_include_dir 中,仍然可以包含这些文件。

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

    更新

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

    更新 2

    问题是设置了目录权限,因此所有者无法查看目录内容。在 cmets 中有进一步的解释

    【讨论】:

    • 根据phpinfo() safe_mode Off Off clearstatcache() 没有改变结果。
    • 正确,它不是符号链接。
    • 文件标志怎么样?从 shell(如果你有 shell 访问权限)你能做一个ls -alh /home/www/public_html | grep index.html 并确保没有在上面设置奇怪的标志吗?
    • 我用 83886 -rwxrwxrwx 1 www www 2.6K 等... 777 试过,但我也试过 766 和 655
    • (从上面复制)布拉德,我终于明白了!我不确定我是否完全理解为什么会这样,但希望你能提供帮助。 public_html 目录具有权限 drw-r-xr-x,但所有者需要 x 权限才能允许 file_exists 处理其内容。所以现在 public_html 目录有 drwxr-xr-x 一切正常。我还有一个问题,也许你可以帮忙:用户“www”也是组“www”的一部分,文件的所有者和组也是“www”,那么为什么拥有这些权限的所有者不能查看目录内容?
    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多