PHP致命错误无法打开所需文件

Posted

技术标签:

【中文标题】PHP致命错误无法打开所需文件【英文标题】:PHP Fatal Error Failed opening required File 【发布时间】: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 时,它说它是最新的。想法?

【问题讨论】:

【参考方案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 是一种语言结构,而不是“真正的”函数,所以括号是可选的。不知道为什么添加它们会为您解决问题。

以上是关于PHP致命错误无法打开所需文件的主要内容,如果未能解决你的问题,请参考以下文章

安装 Sylius 时出错:“PHP 致命错误:require():无法打开所需的 autoload.php”

致命错误:require_once() [function.require]:无法打开所需的 global.php

PHP致命错误:未知:将其添加为auto_prepend_file后无法打开所需的'/home/user/pathto/header.php'

PHP致命错误:require_once():无法打开所需的'Mail.php'(include_path ='。:/usr/share/pear:/usr/share/php')

Zend Framework错误:无法打开所需的'Zend / Application.php'

无法在第 21 行打开流 wp-settings.php 致命错误