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

Assist with diagnosing PHP include, failed to open stream

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

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

我在以下位置安装了 WAMP:

C:\Wamp

我已经更改了 http.conf 和 vhosts.conf 以更改文档根目录

C:\Wamp\www

C:\Wamp\www\Intranet

此文件夹包含一个 index.php,我可以在浏览到本地主机时看到它已正确加载。

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

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

我解决大部分 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 使用正确的斜杠(/\

我认为这条路径 (/site/login/config.php) 在 windows 机器上没有意义。

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

例如:

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.

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

require_once(ROOT_DIR . DS . 'login' . DS . 'config.php');

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