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

时间:2011-03-19 19:06:14

标签: php path

我从Apache

收到以下错误

[Sat Mar 19 23:10:50 2011] [warn] mod_fcgid:stderr:PHP致命错误:require_once()[function.require]:无法打开所需的'/common/configs/config_templates.inc。第158行的/home/viapi​​cs1/public_html/common/configs/config.inc.php中的php'(include_path ='。:/ usr / share / pear:/ usr / share / php')

我绝对不是Apache的专家,而是文件config.inc.php& config_templates.inc.php在那里。我也尝试导航到我放在common / configs /中的test.html页面,所以我假设没有任何权利问题。我还设置了config_templates.inc.php的权限,以赋予每个人读,写和执行权限。不知道该做什么,我查看是否有/ usr / share / php目录,我发现没有,但是当我做了yum install php时,它说它有最新版本。想法?

6 个答案:

答案 0 :(得分:80)

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

require运算符处理文件。但是没有

                          /common/configs/config_templates.inc.php

服务器上的文件,而不是

/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的文章,详细解释了这个问题,并包含了一些实用的解决方案。

  

不幸的是,从命令行运行脚本时,不存在这样一个方便的变量。在这种情况下,称为“单一切入点”的技术是为了救援。您也可以参考上面的文章了解详细信息。

答案 1 :(得分:8)

如果您正在运行SELinux,则可能必须授予httpd权限以使用以下方式从/ home目录读取:

 sudo setsebool httpd_read_user_content=1

答案 2 :(得分:3)

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

答案 3 :(得分:1)

为了防止其他任何人在那里,我偶然发现了一个模糊的案例,因为这个错误在昨晚触发。具体来说,我使用require_once方法并仅指定文件名而没有路径,因为所需的文件存在于同一目录中。

我开始收到打开所需文件的错误'错误一点。在撕掉我的头发一段时间之后,我终于注意到致命错误输出正上方的一条PHP警告消息,表示未能打开流:权限被拒绝',但更重要的是,通知我通往文件它试图打开。然后,我又想到了我在其他地方创建了该文件的副本(其中所有权无法访问),这恰好也存在于PHP' include'搜索路径,并在我希望它被拾取的文件夹之前。 d'!哦

答案 4 :(得分:0)

您可以使用PHP常量__DIR__

对其进行修复。
require_once __DIR__ . '/common/configs/config_templates.inc.php';
  

它是文件的目录。如果在include中使用,则目录   返回包含的文件。这相当于   目录名__FILE__。此目录名称不带斜杠   除非它是根目录。 1

答案 5 :(得分:-7)

我遇到了完全相同的问题,我对包含路径进行了三次检查,我还检查了梨是否已安装,一切看起来还不错,我仍然得到错误,经过几个小时的疯狂看着这个我意识到在我的脚本中有这个:

include_once "../Mail.php";

而不是:

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

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