【问题标题】:PHP Fatal Error Failed opening required FilePHP致命错误无法打开所需文件
【发布时间】:2011-07-18 20:46:36
【问题描述】:

我从 Apache 收到以下错误

[2011 年 3 月 19 日星期六 23:10:50] [警告] mod_fcgid:stderr:PHP 致命错误:require_once() [function.require]:无法打开所需的 '/common/configs/config_templates.inc。 php' (include_path='.:/usr/share/pear:/usr/share/php') 在 /home/viapi​​cs1/public_html/common/configs/config.inc.php 第 158 行

我绝对不是 Apache 的专家,但文件 config.inc.php 和 config_templates.inc.php 在那里。我还尝试导航到我放置在 common/configs/ 中的 test.html 页面,因此我认为没有发生权限问题。我还在 config_templates.inc.php 上设置了权限,给每个人读、写和执行的权限。不知道此时该做什么,我检查了是否有 /usr/share/php 目录,我发现没有,但是当我执行 yum install php 时,它说它是最新的。想法?

【问题讨论】:

    标签: php path


    【解决方案1】:

    这实际上不是与 Apache 相关的问题。甚至没有一个与 PHP 相关的。 要理解此错误,您必须区分 虚拟服务器 上的路径和 文件系统 中的路径。

    require 运算符处理文件。但是这样的路径

                              /common/configs/config_templates.inc.php
    

    只存在于虚拟 HTTP 服务器上,而文件系统中没有这样的路径。正确的文件系统路径是

    /home/viapics1/public_html/common/configs/config_templates.inc.php
    

    在哪里

    /home/viapics1/public_html
    

    部分被称为文档根,它将虚拟世界与真实世界联系起来。幸运的是,Web 服务器通常在与 PHP 共享的配置变量中拥有文档根目录。因此,如果您将代码更改为这样的内容

    require_once $_SERVER['DOCUMENT_ROOT'].'/common/configs/config_templates.inc.php';
    

    它适用于任何目录中的任何文件!

    更新:最终我在文件系统和Web服务器上写了一篇解释difference between relative and absolute paths的文章,详细解释了这个问题,并包含了一些实用的解决方案。就像,当您从命令行运行脚本时,不存在这样一个方便的变量。在这种情况下,一种称为“单一入口点”的技术可以提供帮助。详情也可以参考上面的文章。

    【讨论】:

    • @Al Katawazi nope,在您的 PHP 代码中。您正在处理 PHP 代码中的文件。你必须使用正确的地址
    • 对不起,这不是它。我将代码更新为如下所示:
    • @Al Katawazi 我已经编辑了第二部分(使用__FILE__),现在就试试吧。如果失败,发布它的错误消息。
    • [Sun Mar 20 01:53:43 2011] [warn] mod_fcgid: stderr: PHP Fatal error: require_once() [function.require]:在 /home 中打开所需的 '/home/viapi​​cs1/public_html/photo/common/configs/config.inc.php' (include_path='.:/usr/share/pear:/usr/share/php') 失败/viapi​​cs1/public_html/photo/index.php 在第 2 行。该目录不存在。当它应该进入 html 根目录然后进入公共时,它试图关闭照片然后进入公共。我认为代码是正确的,还有其他一些潜在的问题,可能是在实际打开文件时。
    • @Al Katawazi 这是另一个错误。你必须以类似的方式纠正它
    【解决方案2】:

    如果您正在运行 SELinux,您可能需要授予 httpd 权限以从 /home 目录读取:

     sudo setsebool httpd_read_user_content=1
    

    【讨论】:

      【解决方案3】:

      运行php -f /common/configs/config_templates.inc.php验证文件中PHP语法的有效性。

      【讨论】:

      • 错误信息清楚地表明文件不存在,那么为了确认它不存在而重新运行 php 有什么意义呢? OP 有一个前导斜杠,将路径变成绝对路径。它应该至少是一个没有前导斜杠的相对路径。
      • "错误信息表明文件不存在。"不,它没有。包含路径设置、文件权限设置或安全模式设置可能会导致相同的错误消息。 (我也猜测它可能来自语法错误,具体取决于错误报告设置,但经过一些测试,看起来 PHP 总是显示实际的语法错误。)
      • 你错了。您提到的每种情况都有自己独特的错误消息。以及语法错误。人们可以很容易地将“解析错误”与“找不到文件错误”区分开来。你的假设都是错误的和误导的。获得更多 PHP 经验
      • 我的 error_log 包括堆栈跟踪,其中包含针对这些不同条件的相同文本。例如,这是刚刚从我的日志中提取的一行(隐藏路径),用于不存在的文件:PHP Fatal error: require(): Failed opening required 'sub/include.php' (include_path='.:/usr/local/lib/php') in /path/to/test.php on line 4'' And here's one for an existing file with bad perms: PHP 致命错误:require(): Failed opening required 'sub/include.php' (include_path=' .:/usr/local/lib/php') 在第 4 行的 /path/to/test.php 中"'' 错误的 include_path 同上。
      • 检查文件权限,伙计。 failed to open stream: Permission denied 是错误烫发的错误消息
      【解决方案4】:

      您可以使用 PHP 常量 __DIR__ 修复它

      require_once __DIR__ . '/common/configs/config_templates.inc.php';
      

      它是文件的目录。如果在包含内使用,则目录 返回包含的文件。这相当于 目录名__FILE__。此目录名称没有尾部斜杠 除非它是根目录。 1

      【讨论】:

        【解决方案5】:

        以防万一这对其他人有帮助,我偶然发现了昨晚触发此错误的一个不起眼的案例。具体来说,我使用了 require_once 方法并且只指定了文件名而没有指定路径,因为所需的文件存在于同一目录中。

        我在某一时刻开始收到“打开所需文件失败”错误。扯了一会儿头发后,我终于在致命错误输出的正上方注意到了一条 PHP 警告消息,指示“无法打开流:权限被拒绝”,但更重要的是,它告诉我它正在尝试的文件的路径打开。然后我发现我已经在其他地方创建了文件的副本(Apache 无法访问所有权),该副本恰好也在 PHP 的“包含”搜索路径中,并且在我希望它被拾取的文件夹之前.哦!

        【讨论】:

          【解决方案6】:

          我遇到了完全相同的问题,我三次检查了包含路径,我还检查了 pear 是否已安装,一切看起来都很好,但我仍然收到错误,经过几个小时的疯狂查看后,我意识到在我的脚本中有这个:

          include_once "../Mail.php";
          

          代替:

          include_once ("../Mail.php");
          

          是的,愚蠢的括号不见了,但我的脚本的这一行没有生成错误,这对我来说很奇怪

          【讨论】:

          • 因为 include_once 是一种语言结构,而不是“真正的”函数,所以括号是可选的。不知道为什么添加它们会为您解决问题。
          猜你喜欢
          • 1970-01-01
          • 2013-07-23
          • 2016-02-07
          • 2019-08-10
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 2011-09-18
          • 2017-10-11
          相关资源
          最近更新 更多