关于php:在include中使用$ _SERVER [‘DOCUMENT_ROOT’]是个好主意吗?


Is it a good idea to use $_SERVER['DOCUMENT_ROOT'] in includes?

例如,这是个好主意吗?

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

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

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

例如:我有一个/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的页面调用函数,该方法就会中断。

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


我见过没有设置$_SERVER['DOCUMENT_ROOT']或不是您期望的情况(即未在CLI或旧的IIS中设置,或在某些CGI设置中无效)的情况。

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

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

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

如果DOCUMENT_ROOT不可用,则以下是合适的替代:

1
substr($_SERVER['SCRIPT_FILENAME'], 0, -strlen($_SERVER['SCRIPT_NAME']));


您不需要这样做。 PHP默认情况下会在文档根目录中查找包含的文件。

您可以使用set_include_path($ new_include_path)更改此行为,或在php配置文件中编辑include_path。

另外,从http://php.net/manual/en/reserved.variables.server.php:

'DOCUMENT_ROOT'
The document root directory under which the current script is executing, as defined in the server's configuration file.


例如,如果使用URL重写,当您发现/there/are/so/many/paths/in/the/url/of/this/页面中的include仍在工作时,您将感到非常高兴!