PHP include相对路径

78
我有一个文件/root/update/test.php。还有一个文件/root/connect.php; 这个文件有一行
include "../config.php";

/root/update/test.php中有以下代码

set_include_path(".:/root");
include "connect.php";

当我运行 /root/update/test.php 时,它可以找到 connect.php 文件,但无法找到 config.php 文件,导致出现以下错误信息:

PHP Warning:  include(../config.php): failed to open stream: No such file or directory in /root/connect.php on line 2
PHP Warning:  include(): Failed opening '../config.php' for inclusion (include_path='.:/root')

这让我感到很困惑,因为警告信息让我觉得我做的一切都是正确的 - 包含路径是 /root,它正在寻找 ../config.php (/config.php) 文件,而该文件确实存在。有人能帮我澄清一下吗?请注意,由于部署到我无法访问的生产服务器上,使用绝对路径不是我的选择。

Ubuntu/Apache


1
我试图相对于您的CWD(/root/update/)包含config.php,并搜索/root/config.php。 - user4035
1
这个代码:include "../config.php" 会带你到根目录的上一级文件夹。config.php是否在那里呢? - Gimmy
config.php的完整路径是什么? - meiamsome
6
个人而言,我建议更改所有文件引用为绝对路径,例如包括 realpath(_DIR_ . '/../') . '/config.php'; - Kevin
经常会遇到这个错误,为了快速排除故障,请按照以下步骤操作: stackoverflow.com/a/36577021/2873507 - Vic Seedoubleyew
显示剩余3条评论
2个回答

160

您可以始终使用__DIR__来包含它:

include(dirname(__DIR__).'/config.php');

__DIR__是一个“魔术常量”,返回当前文件的目录,但不包含结尾的斜杠。它实际上是绝对路径,只需要将文件名连接到__DIR__即可。在这种情况下,由于我们需要向上升级目录,因此我们使用PHP的dirname函数来向上升级文件树,然后从此处访问config.php

您也可以在此方法中设置根路径:

define('ROOT_PATH', dirname(__DIR__) . '/');

在test.php中,会将你的根目录设置为/root/级别。

include(ROOT_PATH.'config.php');

那么应该努力将配置文件包含在您想要的位置。


3
如果您计划在相对路径(例如 ../)中使用这些常量,我建议在 define() 之前使用 realpath() 对其进行清理。 - Jason McCreary
1
不要使用ROOT_PATH.'../',而应该使用dirname(ROOT_PATH)。后者会给您提供一个“更绝对”的路径。 - Kayla
我已经开始为这个常见的错误制作故障排除清单,链接在这里:stackoverflow.com/a/36577021/2873507 - Vic Seedoubleyew
你应该考虑到在Windows系统中,dirname(DIR)获取的是带有反斜杠的目录,因此这种方法只适用于Linux系统。 - user10201743
所以,使用您提供的答案时,我们使用绝对路径而不是相对路径,对吗? - Adi Prasetyo
我认为 include(__DIR__."/../config.php"); 看起来更好。 - zomega

1

虽然我欣赏您认为绝对路径不是一个选择,但它比相对路径和更新PHP包含路径更好。

使用带有基于环境设置的常量的绝对路径。

if (is_production()) {
    define('ROOT_PATH', '/some/production/path');
}
else {
    define('ROOT_PATH', '/root');
}

include ROOT_PATH . '/connect.php';

如评论所述,ROOT_PATH也可以从当前路径$_SERVER['DOCUMENT_ROOT']等中派生。

define('ROOT_PATH', __DIR__.'/../');,也许? - meiamsome
1
这绝对是一个好建议,肯定可以行得通 - 但__DIR__才是我正在寻找的更准确的内容。(我不是那个给你点踩的人) - George B
我已经在此处开始了一个针对这个频繁错误的故障排除清单: stackoverflow.com/a/36577021/2873507 - Vic Seedoubleyew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接