一尘不染

在include中使用$ _SERVER ['DOCUMENT_ROOT']是个好主意吗?

php

例如,这是个好主意吗?

require_once($_SERVER['DOCUMENT_ROOT'].'/include.php');

如果您在同一台服务器上有两个虚拟主机,一个虚拟主机,一个虚拟主机,并且使用不同的Apache
DocumentRoots,则这将避免当include的来源未知并且可以在任何目录中时,不必包含绝对路径。

(注意:以下部分中的文件路径是相对于Web根目录的。实际上,它们类似于/var/www/app/core/init.php,其中/var/www/appWeb根目录在哪里)

例如:我有一个/core/init.php,它是使用来自网站(/file.php/dir/file.php or /dir/dir/file.php)各地的相对路径来调用的。

然后,此init.php在fund目录中包含子目录/core(如/core/func/userfunctions.php)的几个功能页。

因此,在init.php中,我可以使用该$_SERVER方法,因为如果我使用相对路径并尝试从诸如这样的页面调用函数,则该方法会中断/dir/file.php

我看不到任何问题,但总的来说会出什么问题?


阅读 407

收藏
2020-05-29

共1个答案

一尘不染

我曾见过$_SERVER['DOCUMENT_ROOT']未设置或未达到预期的情况(即未在CLI或旧的IIS中设置,或在某些CGI设置中无效)。

因此,您可以dirname(__FILE__)用来获取调用该行的脚本的路径。然后可以从那里引用相对路径,例如

include dirname(__FILE__) . '/../../other/file.php';

当文件的目录结构已知并且不会更改时,我会采用上述方法。

如果DOCUMENT_ROOT没有,则以下为合适的替代品:

substr($_SERVER['SCRIPT_FILENAME'], 0, -strlen($_SERVER['SCRIPT_NAME']));
2020-05-29