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 在尝试包含/需要包含/需要另一个脚本的脚本时抛出致命错误的主要内容,如果未能解决你的问题,请参考以下文章
带有循环包含的脚本中的未定义变量(第一个脚本包含另一个包含第一个的)