【问题标题】:Assist with diagnosing PHP include, failed to open stream协助诊断 PHP 包含,无法打开流
【发布时间】:2017-05-09 01:40:30
【问题描述】:

我正在尝试将在 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 有一个 iFrame,可以从

加载welcome.php
/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

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

【问题讨论】:

标签: php filepath require-once


【解决方案1】:

我认为这条路径 (/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 中使用的路径(这是一个文件系统路径)混淆之外。

【讨论】:

  • 在旧机器上,当所有站点内容和文档根目录都存储在辅助卷的根目录上时,这曾经可以工作。 E:\。我怀疑包含路径在该实例中有效,因为它从 E:\ 的根目录开始并从那里找到正确的文件夹结构?是的,我想我可能会混淆这两种路径类型。
  • 过去有什么用?您在问题中发布的代码?硬编码路径的问题恰恰在于:在不同的机器或不同的架构上部署会咬你一口,所以这样的解决方案更简洁、更便携。
  • 没错,我发布的代码有效。我认为这是我的天真,因为我认为 Windows 上的 PHP 绝对路径从文档根目录开始,而不是文件系统根目录。
  • 如果你根本不使用绝对路径会更好。 PHP 上的绝对路径和绝对路径始终依赖于文件系统。没有“文档根相对”路径,除非您将文档根添加到路径中。您可以在 apache 上使用 $_SERVER['DOCUMENT_ROOT'],但最好只在运行时确定应用程序的根目录。
  • 我倾向于同意您的观点,只是希望避免进行大量调整,因为该网站是旧网站,不久将被 SharePoint 取代。
【解决方案2】:

我倾向于通过设置变量路径来解决我的大部分包含/要求错误:

$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 使用正确的斜杠(/\

【讨论】:

  • 谢谢,在 SO 上看到一些人建议这种方法。我希望做一个简单的提升和转变,因为这个网站是旧的,正在被 SharePoint 网站取代。如果可能的话,希望不必进行任何重大的重写:)
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2019-12-03
  • 2015-05-10
  • 1970-01-01
  • 2012-05-14
相关资源
最近更新 更多