PHP致命错误打开所需文件失败

a14dhokn  于 2023-02-21  发布在  PHP
关注(0)|答案(7)|浏览(150)

我收到来自Apache的以下错误

**[2011年3月19日星期六23:10:50] [警告] mod_fcgid:stderr:PHP致命错误:require_once()[函数.require]:无法打开第158行上的/home/viapics 1/public/html/common/configs/config. inc. php中所需的“/配置文件”(包含路径=“。:/usr/share/pear:/usr/share/php”)

我当然不是ApacheMaven,但是文件config.inc.php & config_templates.inc.php在那里。我也试着导航到我放在common/configs/中的test.html页面,所以我认为没有权限问题。我还设置了config_templates.inc.php上的权限,给予每个人读、写和执行权限。现在不知道该怎么做,我检查了一下是否有一个/usr/share/php目录,我发现没有,但是当我安装yum php时,它说它有最新的。

h5qlskok

h5qlskok1#

这实际上不是一个与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';
  • 它可以从任何目录中的任何文件中工作! *

更新:最后我写了一篇文章,解释了difference between relative and absolute paths在文件系统和Web服务器上的作用,详细解释了这个问题,并包含了一些实用的解决方案。当你从命令行运行你的脚本时,这样一个方便的变量是不存在的。2在这种情况下,一个叫做"单一入口点"的技术是拯救。3你也可以参考上面的文章来获得细节。

w46czmvw

w46czmvw2#

如果您运行的是SELinux,则可能需要使用以下命令授予httpd从/home目录读取的权限:

sudo setsebool httpd_read_user_content=1
zc0qhyus

zc0qhyus3#

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

4urapxun

4urapxun4#

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

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

它是文件的目录。如果在include中使用,则返回包含的文件的目录。这等效于dirname __FILE__。此目录名没有尾随斜杠,除非它是根目录。1

brjng4g3

brjng4g35#

为了防止这对其他人有帮助,我昨晚偶然发现了这个错误触发的一个模糊案例。具体地说,我使用了require_once方法,并且只指定了文件名而没有指定路径,因为所需的文件存在于同一目录中。
我开始在一个点上得到'失败打开所需的文件'错误。在撕裂了我的头发了一会儿,我终于注意到一个PHP警告消息紧挨着致命错误输出,表明'失败打开流:Permission denied“,但更重要的是,通知我它试图打开的文件的路径。然后我发现我在其他地方创建了该文件的副本(Apache无法访问其所有权),该副本碰巧也在PHP的”include“搜索路径中,并且位于我希望它被选中的文件夹之前。

qltillow

qltillow6#

您可以在php.ini中设置包含路径
include_path = ".:/home/viapics1/public_html"

pkbketx9

pkbketx97#

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

include_once "../Mail.php";

而不是:

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

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

相关问题