协助诊断 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 中使用的路径(这是一个文件系统路径)。
我正在尝试将 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 中使用的路径(这是一个文件系统路径)。