2012-04-10 56 views
0

就我所知,基本上就是这样。我可以包括或require_once有没有脚本包含/ require_once,但如果这样做,那么PHP抛出我这个错误:PHP尝试包含/需要包含/需要其他脚本的脚本时会引发致命错误

Warning: require_once(../constants/constants.php) [function.require-once]: failed to open stream: No such file or directory in C:\Home\Workspace\PHP\DD\src\log\test.php on line 7

Fatal error: require_once() [function.require]: Failed opening required '../constants/constants.php' (include_path='.;C:\Program Files\Xampp 1.7.7\php\PEAR') in C:\Home\Workspace\PHP\DD\src\log\test.php on line 7

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

Options +FollowSymLinks

RewriteEngine on

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

我的Apache文档根目录为 “C:/家庭/工作区/ PHP”


UPDATE: 我发现,使用绝对路径的作品,像这样:

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

我想我只是不使用相对路径,然后。

+2

这与Apache无关。包含的嵌套include文件必须包含相对于自己的正确路径。 '../ constants/constants.php'不在基于包含文件的正确位置。 – 2012-04-10 03:07:14

+0

@Michael你应该把这个作为答案。 ;-)使用'dirname(__ FILE __)'来获取当前的php文件的目录,而不管当前的工作目录如何,即使它们位于不同的目录中,对于所有的php文件也是如此。 – Basti 2012-04-10 03:09:30

回答

3

原因是相对路径来自具有第一个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。我希望能够消除任何混乱。

+0

我想我明白了。我认为使用相对路径是一种很好的做法,但似乎我错了。我尝试使用dirname(__ FILE__),但它不起作用。尽管如此,$ _SERVER ['DOCUMENT_ROOT']似乎也可以做到。 感谢您的帮助! :) – drakenation 2012-04-10 03:40:45

+0

'dirname(__ FILE __)'。注意两个'_'。有关更多信息,请参见[关于魔术常量的PHP手册](http://php.net/manual/en/language.constants.predefined.php)。 – Basti 2012-04-10 04:01:14

+0

从5.3开始,php有'__DIR__',这相当于'dirname(__ FILE __)'。 – Maerlyn 2012-04-10 04:17:05