【问题标题】:PHP File Exists Always FalsePHP 文件存在总是错误的
【发布时间】:2010-12-20 10:51:26
【问题描述】:

我遇到过 file_exists() 总是返回 false 的情况。我最近的尝试是测试它是否会为 $_SERVER["SCRIPT_FILENAME"] 返回 true,然后如果找不到它所找到的文件,则返回路径的值。

与解决问题不一定相关的路径是:/Users/joe/Workspace/720/app/webroot/index.php

我显然已经验证了该文件在那里,但我什至不确定它是如何不存在的,因为 php 正在为它提供服务。

我应该提到这是在运行 PHP 5.3.0 的 OS X Snow Leopard 的安装上。

任何想法都会很棒。

代码示例:

if (!file_exists($_SERVER["SCRIPT_FILENAME"]))
    $errors[] = 'Cant find:'. $_SERVER["SCRIPT_FILENAME"];

【问题讨论】:

  • 显然该功能应该可以工作,因此需要一个代码示例。
  • 发布实际代码可能会有所帮助。
  • getcwd() 的值是多少? $_SERVER["SCRIPT_FILENAME"] 可能在不同的目录中。
  • 我也有同样的问题,PHP 版本 5.2.14; getcwd() 返回“/home/me/public_html”; file_exists('/images/products/me.jpg') 返回 false; file_exists('/home/me/public_html/images/products/me.jpg') 返回真;我不知道为什么它会失败,因为在不同的页面上 file_exists('/images/products/me.jpg') 返回 true,但是使绝对路径 always 有效;即保罗的解决方案也适用于我。

标签: php macos osx-snow-leopard file-exists


【解决方案1】:

使用file_exists($_SERVER['DOCUMENT_ROOT']."/path/to/file") 这样php会为你提供绝对路径。

【讨论】:

    【解决方案2】:

    我刚刚遇到了这个问题,并且在过去的几个小时里一直被困在这个问题上。答案是您需要指定 ABSOULTE 路径才能使 file_exists() 工作。您不能使用相对路径,例如“dir1/images/image.jpg”或“../../images/image1.jpg”。您需要指定'/rootdir/subdir/dir1/images/myimage.jpg'。

    无论如何,这对我有用。

    【讨论】:

    • 这为我解决了。在共享服务器上查找绝对路径有点困难,因为它可能不是您的 FTP 帐户的根目录,但可以通过 phpinfo() 找到。
    【解决方案3】:

    还要检查父目录及其所有父目录,以确保每个人都具有执行权限。

    如果您在 Apache 下(而不是在命令行上)运行它,请记住它在 Snow Leopard 上的 _www 用户和 _www 组下运行。这就是需要访问权限的组。

    【讨论】:

    • 谢谢。我跑了sudo chown -R _www:_www filesfolder/,它成功了。
    【解决方案4】:

    这可能会有所帮助:
    http://bugs.php.net/bug.php?id=48535

    具体来说:

    我已经将 php.ini 中的 fastcgi.impersonate 设置为 1(比如 文档中的推荐)。 如果我将其设置为 0,它会起作用。

    【讨论】:

      【解决方案5】:

      来自file_exists()上的php手册

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

      这只是一个猜测,代码示例可能会让事情更清楚。

      file_exists() 可能无法访问文件的另一个原因(与安全模式无关):

      注意:检查是使用真实的 UID/GID 而不是有效的。

      此脚本在我的 linux 机器上运行良好(几乎就是您添加的示例):

      <?php
        if (file_exists($_SERVER["SCRIPT_FILENAME"])){
          echo "Found File: ";
        } else {
          echo "No File: ";
        }
      
        echo $_SERVER["SCRIPT_FILENAME"];
      ?>
      

      【讨论】:

      • safe_mode 已弃用,但我也验证了该标志在 php.ini 中已关闭。
      • 它已被弃用,但这当然并不意味着它没有在不同的配置中启用 - 只是它不应该启用。也许是 UID/GID 问题?
      • 会启用什么不同的配置呢?雪豹在某个地方有一些忍者配置?我的印象是这是一个特定于 php 的设置,而不是 apache 或其他?
      • 我的意思是,php 的各种安装意味着您将进入安全模式,无论其贬值如何。在您自己的机器上进行标准安装不太可能,但仍然可以检查。
      • 换句话说:“已弃用”并不意味着它不再有效。这意味着它可能在未来的版本中不再有效,所以你应该避免它。
      【解决方案6】:

      安全模式?

      来自 PHP file_exists documentation:

      警告


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

      【讨论】:

      • safe_mode 已弃用,但我也验证了该标志在 php.ini 中已关闭。
      【解决方案7】:

      这可能是文件权限问题。确保_www 用户(在 Mac OS X 上用于运行 apache {httpd} 的用户)可以访问您正在测试的文件。

      也许您可以尝试使用 777 作为权限位测试 /tmp 上的文件。

      希望对您有所帮助。

      【讨论】:

      • 我将有问题的文件修改为 777,结果相同。我只是在这里使用 SCRIPT_FILENAME 变量来向大家保证该文件确实存在,这不是路径错字。
      猜你喜欢
      • 2011-08-12
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 2017-08-16
      • 2012-12-01
      • 2021-06-19
      相关资源
      最近更新 更多