PHP 在尝试包含/需要包含/需要另一个脚本的脚本时抛出致命错误

Posted

技术标签:

【中文标题】PHP 在尝试包含/需要包含/需要另一个脚本的脚本时抛出致命错误【英文标题】:PHP throws a Fatal Error when trying to include/require a script that includes/requires another script 【发布时间】:2012-04-22 09:06:01 【问题描述】:

据我所知,基本上就是这样。我可以包含或 require_once 一个没有包含/require_once 的脚本,但如果包含/require_once,那么 php 会抛出这个错误:

警告:require_once(../constants/constants.php) [function.require-once]:无法打开流:C:\Home\Workspace\PHP\DD\src\log\ 中没有这样的文件或目录第 7 行的 test.php

致命错误:require_once() [function.require]: 无法打开所需的 '../constants/constants.php' (include_path='.;C:\Program Files\Xampp 1.7.7\php\PEAR')在第 7 行的 C:\Home\Workspace\PHP\DD\src\log\test.php 中

路径正确。我担心我可能弄乱了 Apache Webserver 的一些配置文件(我创建了一个 .htaccess 文件来使用 mod_rewrite 以创建一些更好的 URL)。 .htaccess 文件内容就是这样:

选项 +FollowSymLinks

重写引擎开启

RewriteRule !.(gif|jpg|png|css)$ index.php

我的 apache 文档根目录是“C:/Home/Workspace/PHP”

更新: 我发现使用绝对路径是可行的,如下所示:

require_once $_SERVER['DOCUMENT_ROOT']."/DD/src/constants/constants.php";

我想我不会使用相对路径,那么。

【问题讨论】:

这与 Apache 无关。执行嵌套包含的文件在包含时必须具有相对于自身的正确路径。根据包含的文件,../constants/constants.php 不在正确的位置。 @Michael 您应该将此作为答案。 ;-) 使用dirname(__FILE__) 获取当前 php 文件的目录,而不考虑当前的工作目录,这对于所有 php 文件来说都是相同的,即使它们位于不同的目录中。 【参考方案1】:

原因是相对路径来自第一个 require/include 的文件。例如,如果我有一组看起来像这样的文件:

|--bar
|   |--foo
|   |   |--foo.php
|   |--bar.php
|--test.php

如果 test.php 有

require("./bar/bar.php")

和 bar.php 有

require("./foo/foo.php")

那么这将失败,因为相对 URL 必须相对于工作目录(调用 require/include 的顶部文件)。如果我将 bar.php 更改为 require("./bar/foo/foo.php"),那么程序将成功完成。正如 Basti 所说,确保不会发生这种情况的最佳方法是不使用相对 URL。通常建议使用 dirname(__FILE__) 等各种函数来构建 URL。

最后一件事,.htaccess 文件中的重写规则不会做任何事情,它只会操纵客户端 URL。我希望这能消除任何困惑。

【讨论】:

我想我明白了。我认为使用相对路径是一种很好的做法,但似乎我错了。我尝试使用 dirname(FILE),但它不起作用。不过,$_SERVER['DOCUMENT_ROOT'] 似乎可以做到。谢谢您的帮助! :) dirname(__FILE__)。注意这两个_。请参阅the PHP manual on magic constants 了解更多信息。 从 5.3 开始,php 具有 __DIR__,相当于 dirname(__FILE__)

以上是关于PHP 在尝试包含/需要包含/需要另一个脚本的脚本时抛出致命错误的主要内容,如果未能解决你的问题,请参考以下文章

带有循环包含的脚本中的未定义变量(第一个脚本包含另一个包含第一个的)

执行包含完整路径的python可执行文件和脚本

在 Perl 中将包含空格的参数从一个脚本传递到另一个脚本

Nginx + PHP:当我尝试在包含的文件中调用函数时,脚本死了

Joomla 组件:在视图中包含/需要 php

执行位于另一个文件夹中的 PHP 文件