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


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

例如,这是一个好主意吗?

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

如果在同一台服务器上有两个虚拟主机,一个用于实时主机,一个用于开发,具有不同的 Apache DocumentRoots,这将避免在包含源未知且可能位于任何目录中时包含绝对路径。

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

例如:我有一个/core/init.php它被称为使用来自整个网站(/file.php/dir/file.php or /dir/dir/file.php)的相对路径。

这个 init.php 然后包括几个功能页面,在基金目录中,/core 的子目录(如 /core/func/userfunctions.php )。

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

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

我见过$_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']));

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

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

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

"DOCUMENT_ROOT" 当前脚本在其下执行的文档根目录,如服务器的配置文件中所定义。

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