我从 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 时,它说它有最新的。
有什么想法吗?
这实际上不是一个与 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';
它将适用于放置在任何目录中的任何文件!
更新:最终我写了一篇文章,解释了文件系统和网络服务器中的“相对路径和绝对路径之间的区别”,其中详细解释了这个问题,并包含一些实用的解决方案。就像,当您从命令行运行脚本时,这样一个方便的变量并不存在。在这种情况下,一种称为“单一入口点”的技术可以解决这个问题。您也可以参考上面的文章了解详细信息。
sudo setsebool httpd_read_user_content=1
php -f /common/configs/config_templates.inc.php
来验证文件中PHP语法的有效性。
我一度开始收到“无法打开所需文件”错误。费了一番功夫后,我终于注意到致命错误输出上方紧接着有一条 PHP 警告消息,指示“无法打开流:权限被拒绝”,但更重要的是,通知我它试图访问的文件的路径打开。然后我意识到我已经在其他地方创建了该文件的副本(Apache 无法访问其所有权),该副本恰好也在 PHP“include”搜索路径中,并且位于我希望拾取该文件的文件夹之前。哦!
file_exists
和
is_readable
。就我而言,我有一个棘手的文件名拼写错误,乍一看是不可见的。
include_path = ".:/home/viapics1/public_html"
include_once "../Mail.php";
而不是(行为等价):
include_once ("../Mail.php");
是的,括号没有丢失,但是我的脚本的这一行没有生成错误,这对我来说很奇怪,而且我可能以愚蠢的方式收到了这个错误。