为什么我会收到 PHP 致命错误无法打开所需文件?

问题描述 投票:0回答:8

我从 Apache 收到以下错误:

[Sat Mar 19 23:10:50 2011] [warn] mod_fcgid: stderr: PHP Fatal error:  require_once() [<a href='function.require'>function.require</a>]: Failed opening required '/common/configs/config_templates.inc.php' (include_path='.:/usr/share/pear:/usr/share/php') in /home/viapics1/public_html/common/configs/config.inc.php on line 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
8个回答
110
投票

这实际上不是一个与 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';

它将适用于放置在任何目录中的任何文件!

更新:最终我写了一篇文章,解释了文件系统和网络服务器中的“相对路径和绝对路径之间的区别”,其中详细解释了这个问题,并包含一些实用的解决方案。就像,当您从命令行运行脚本时,这样一个方便的变量并不存在。在这种情况下,一种称为“单一入口点”的技术可以解决这个问题。您也可以参考上面的文章了解详细信息。


11
投票

sudo setsebool httpd_read_user_content=1



5
投票
__DIR__


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

  
是文件的目录。如果在包含内部使用,则目录 返回包含的文件。这相当于 目录名
__FILE__

。该目录名称没有尾部斜杠 除非是根目录。

1


4
投票
php -f /common/configs/config_templates.inc.php

来验证文件中PHP语法的有效性。

    


2
投票

我一度开始收到“无法打开所需文件”错误。费了一番功夫后,我终于注意到致命错误输出上方紧接着有一条 PHP 警告消息,指示“无法打开流:权限被拒绝”,但更重要的是,通知我它试图访问的文件的路径打开。然后我意识到我已经在其他地方创建了该文件的副本(Apache 无法访问其所有权),该副本恰好也在 PHP“include”搜索路径中,并且位于我希望拾取该文件的文件夹之前。哦!


0
投票
file_exists

is_readable
。就我而言,我有一个棘手的文件名
拼写错误
,乍一看是不可见的。


0
投票

include_path = ".:/home/viapics1/public_html"


                

-7
投票

include_once "../Mail.php";

而不是(行为等价):

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

是的,括号没有丢失,但是我的脚本的这一行没有生成错误,这对我来说很奇怪,而且我可能以愚蠢的方式收到了这个错误。

© www.soinside.com 2019 - 2024. All rights reserved.