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

PHP致命错误无法打开所需文件,php,path,Php,Path,我从Apache获得以下错误 [Sat Mar 19 23:10:50 2011][warn]mod_fcgid:stderr:PHP致命错误:require_once()[function.require]:在/home/viapics1/public_html/common/configs/configs/config_templates.inc.PHP(include_path=.:/usr/share/pear:/usr/share/PHP)中打开所需文件失败,第158行 我肯定不是Ap

我从Apache获得以下错误

[Sat Mar 19 23:10:50 2011][warn]mod_fcgid:stderr:PHP致命错误:require_once()[function.require]:在/home/viapics1/public_html/common/configs/configs/config_templates.inc.PHP(include_path=.:/usr/share/pear:/usr/share/PHP)中打开所需文件失败,第158行


我肯定不是Apache的专家,但是config.inc.php和config_templates.inc.php文件就在那里。我还尝试导航到放置在common/configs/中的test.html页面,因此我假设没有权限问题。我还设置了config_templates.inc.php上的权限,为每个人提供读取、写入和执行权限。现在不确定该怎么办,我检查了一下是否有/usr/share/php目录,发现没有,但当我安装php时,它说它有最新的。想法

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

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

require
操作员处理文件。但是像这样的路

                          /common/configs/config_templates.inc.php
require_once $_SERVER['DOCUMENT_ROOT'].'/common/configs/config_templates.inc.php';
仅存在于虚拟HTTP服务器上,而文件系统中没有这样的路径。正确的文件系统路径是

/home/viapics1/public_html/common/configs/config_templates.inc.php
在哪里

部分称为文档根,它连接虚拟世界和真实世界。幸运的是,web服务器通常在与PHP共享的配置变量中具有文档根。如果你把代码改成这样

                          /common/configs/config_templates.inc.php
require_once $_SERVER['DOCUMENT_ROOT'].'/common/configs/config_templates.inc.php';
它将从任何目录中的任何文件工作


更新:最终我写了一篇文章,解释了在文件系统和web服务器上的问题,详细解释了这个问题,并包含了一些实用的解决方案。比如,当您从命令行运行脚本时,这样一个方便的变量并不存在。在这种情况下,一种称为“单一入口点”的技术将用于救援。您也可以参考上面的文章了解详细信息。

我遇到了完全相同的问题,我对include路径进行了三次检查,我还检查了pear是否已安装,一切正常,我仍然收到错误,在疯狂地看了几个小时后,我意识到在我的脚本中有以下内容:

include_once "../Mail.php";
而不是:

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

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

如果您运行SELinux,您可能必须使用以下命令授予httpd从/home dir读取的权限:

 sudo setsebool httpd_read_user_content=1

为了防止这对其他人有帮助,我昨晚偶然发现了一个关于这个错误触发的模糊案例。具体来说,我使用的是require_once方法,只指定一个文件名而不指定路径,因为所需的文件位于同一目录中


我在某一点上开始出现“打开所需文件失败”错误。经过一段时间的纠结,我终于注意到致命错误输出上方有一条PHP警告消息,指示“无法打开流:权限被拒绝”,但更重要的是,通知我它试图打开的文件的路径。然后,我注意到我在别处创建了一个文件副本(Apache无法访问其所有权),该副本恰好也位于PHP“include”搜索路径中,并且位于我希望获取该文件的文件夹之前。哦

您可以使用PHP常量
\uuuuu DIR\uuuuu

require_once __DIR__ . '/common/configs/config_templates.inc.php';
它是文件的目录。如果在包含中使用,则为 返回包含的文件。这相当于 目录名
\uuuu文件\uuuu
。此目录名没有尾随斜杠 除非它是根目录


@Al Katawazi nope,在您的PHP代码中。您正在PHP代码中寻址一个文件。你必须使用正确的地址抱歉,不是这样的。我将代码更新为如下所示:@Al-Katawazi我已经编辑了第二部分(使用
\uuuu FILE\uuuuu
),请立即尝试。如果失败,发布错误消息。[Sun Mar 20 01:53:43 2011][warn]mod_fcgid:stderr:PHP致命错误:require_once()[]:在第2行的/home/viapics1/public_html/photo/common/configs/config.inc.PHP(include_path=”:/usr/share/pear:/usr/share/PHP)中打开所需的“/home/viapics1/public_html/photo/index.PHP”失败。那个目录不存在。它试图先关闭photo,然后转到common,这时它应该转到html根目录,然后转到common。我认为代码是正确的,可能在实际打开文件时存在其他潜在问题。@Al-Katawazi这是另一个错误。您必须以类似的方式进行更正错误消息表明文件不存在,那么重新运行php只是为了确认它不存在有什么意义呢?OP有一个前导斜杠,将路径转换为绝对路径。它至少应该是一个没有前导斜杠的相对路径。“错误消息表明该文件不存在。”不,它不存在。相同的错误消息可能由包含路径设置、文件权限设置或安全模式设置导致。(我还猜测它可能来自语法错误,具体取决于错误报告设置,但经过一些测试后,PHP似乎总是显示实际的语法错误。)你错了。您提到的每种情况都有自己独特的错误消息。以及语法错误。可以很容易地区分“解析错误”和“文件未找到错误”。你的假设都是错误和误导的。获取有关PHPMy error_日志的更多经验,日志包括堆栈跟踪,其中包含针对这些不同条件的相同文本。例如,这是我刚刚从日志中为一个不存在的文件提取的一行代码:
PHP致命错误:require():无法在/path/to/test.PHP中打开所需的'sub/include.PHP'(include_path=。:/usr/local/lib/PHP')