协助诊断PHP包含,无法打开流

时间:2016-12-23 10:45:52

标签: php filepath require-once

我正在尝试将在Apache 2.2上运行的旧Intranet站点移动到本地计算机上的WAMP设置(最新版本)。

我目前遇到的一个问题是require_once路径无法打开,我无法确定原因是什么。

我安装了WAMP:

C:\Wamp

我更改了http.conf和vhosts.conf以从

更改文档根目录
C:\Wamp\www

C:\Wamp\www\Intranet

此文件夹包含index.php,我可以看到在浏览localhost时正确加载。

Index.php有一个从

加载welcome.php的iFrame
/site/welcome.php

这可以在iFrame加载时起作用,但会抛出500错误。

启用PHP错误,iFrame中的welcome.php页面在require_once上给出了错误。 require_once是:

/site/login/config.php.

正如您所看到的,我在这里使用绝对路径,因此index.php能够加载/site/welcome.php这一事实告诉我它正在加载正确的文件:

C:\Wamp\www\Intranet\site\welcome.php

我希望我的require_once能够加载绝对路径:

C:\Wamp\www\Intranet\site\login\config.php

哪个是有效的文件路径。

令我困惑的是,我使用的第一个绝对路径似乎是从文档根目录开始,而不是物理目录根目录。

我正在使用的第二个绝对路径似乎不是从文档根目录开始的。

更有趣的是,如果我更改require_once

/site/login/config.php

/login/config.php

它有效吗?!我不指望它,因为这表明我指定的绝对路径实际上是一条相对路径?

2 个答案:

答案 0 :(得分:1)

我倾向于解决大多数include / require错误是通过设置变量路径:

$path = dirname(__FILE__);
include($path.'/file.php');

这可以防止您在不同的环境中遇到麻烦,在这种情况下是Windows和Linux。

甚至更好:

define('ROOTPATH', realpath(dirname(__FILE__) . '/'));
require ROOTPATH.'login/config.php';

另一件事,可能不会导致你的问题,但是做好练习就是设置DIRECTORY_SEPaRATOR

define('DS', DIRECTORY_SEPARATOR);

include(DS.'home'.DS.'www'.DS);

这将使PHP使用正确的斜杠(/\

答案 1 :(得分:1)

我不认为这条路径(var numbers = []; var sum = 0; for (var i = 3; i <= 100; i = i + 3) { numbers[i] = i; document.write("<br/>" + i); sum = sum + i; } document.write("<br/>sum = " + sum); )在Windows机器上有意义。

比硬编码完整文件路径更好,在运行时确定它。

E.g:

/site/login/config.php

然后包含您的配置文件,来自 welcome.php 将是:

define('ROOT_DIR', realpath(dirname(__FILE__)));
// because *nix and Windows path separators aren't the same (/ vs \)
define('DS', DIRECTORY_SEPARATOR); 
// just for convenience sake, you could use DIRECTORY_SEPARATOR on its own.

我认为除了你在iframe声明中使用的路径(这是一个url路径)与你在require中使用的路径(这是一个文件系统路径)混淆。