【问题标题】:Why would is_readable & is_writable & file_exists fail for URL path and not for a file in the same directory?为什么 is_readable & is_writable & file_exists 对于 URL 路径而不是同一目录中的文件会失败?
【发布时间】:2011-09-15 05:48:33
【问题描述】:

我已经在谷歌上搜索了两天这个问题,真的没有找到任何人可以给我一个可靠的答案。也许stackoverflow的天才可以提供帮助?

我的难题:我正在尝试使用指向我服务器上文件的 URL 的 URL 语法读取和写入文件。 (参见下面的代码)只要文件名与 php 文件位于同一目录中并且我没有在其上使用任何 URL 套接字,代码就可以正常工作。 (即 $filename = "test.xml")但是当我尝试添加一个 URL 套接字(即http://127.0.0.1/site_folder/text.xml)时,我在所有三个测试(is_readable、is_writable、file_exists)中都失败了。为什么会这样?有没有办法纠正它,以便我可以读写这个文件?

我的设置:Microsoft Vista 机器上 Microsoft IIS 7.0.6000.16386 上的 PHP 5.3.2 PHP 目录:c:\Program Files (x86)\php\ 安全性:我已经为IUSR帐户设置了文件目录和文件本身的权限,可以读取、写入、执行、列出目录。此 php 文件目前与 test.xml 文件位于同一目录中。但我想让这个 URL 正常工作,以便将来可以调整不同目录中的文件。

php.ini 配置:我已经尝试过这些设置:

open_basedir=Off; 
fastcgi.impersonate = 1;
display_errors = On;
error_reporting = E_ALL & ~E_STRICT;
safe_mode = Off;
allow_url_fopen = Off; (and tried On, neither works);
allow_url_include = Off; (and tried On, neither works);

这是我的简单代码示例:

<?php
        $filename = "http://127.0.0.1/sitename/admin/interface/test.xml"; // this one fails
//      $filename = "text.xml" // this one works fine
    echo $filename;

        if (is_readable($filename)) {
                echo "<br />The file is readable...<br />";
        } else {
                echo "<br />The file is not readable...<br />";
        }

        if (is_writable($filename)) {
                echo "The file is writable...<br />";
        } else {
                echo "The file is not writable...<br />";
        }

        if (file_exists($filename)) { 
                echo "File exists...<br />";
        } else {
                echo "File cannot be found...<br />";
        }
?>

我得到的输出:

http://127.0.0.1/sitename/admin/interface/test.xml
The file is not readable...
The file is not writable...
File cannot be found...

知道为什么会这样吗? 附带说明一下,我的 Macbook Pro 上的 PHP 5.3.2 也发生了同样的事情,上面有 Apache 服务器。

【问题讨论】:

  • 选对答案就这么难吗?

标签: php file-io file-permissions


【解决方案1】:
$filename = "//127.0.0.1/sitename/admin/interface/test.xml";

您可以尝试更改此路径,例如 ../../test.xml 或在同一目录中使用 test.xml 我试过了,同样的问题解决了

【讨论】:

    【解决方案2】:

    http:// 协议包装器不支持 stat() 系列函数(请参阅:http://php.net/manual/wrappers.http.php 以了解支持的内容)。 file_exists、is_writable 和 is_readable 都需要 stat() 支持。

    file:// 协议包装器(在您的工作示例中使用的默认包装器)确实支持 stat():http://php.net/manual/wrappers.file.php

    您可以在此处阅读有关协议和包装器的更多信息: http://php.net/manual/wrappers.php

    【讨论】:

      【解决方案3】:

      如果您想执行文件 I/O,则传入实际路径(使用 $_SERVER['DOCUMENT_ROOT'] 可能有助于指定这些路径)。 PHP 的fopen 支持对 URL 的特殊处理,但其他文件 I/O 函数的包装器不支持。

      【讨论】:

      • 我建议不要使用$_SERVER['DOCUMENT_ROOT'],因为通过 CLI 使用 PHP 时不会设置它。
      猜你喜欢
      • 2020-04-22
      • 2011-09-30
      • 2012-07-26
      • 2013-09-05
      • 1970-01-01
      • 2021-08-27
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多