14

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

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

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

(注意:下一节中的文件路径是相对于 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 包括几个功能页面,在基金目录中,一个子目录/core(如/core/func/userfunctions.php)。

因此,在 init.php 中,我可以使用该$_SERVER方法,因为如果我使用相对路径并尝试从/dir/file.php.

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

4

3 回答 3

10

我见过$_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']));
于 2012-08-10T00:52:11.997 回答
2

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

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

此外,来自http://php.net/manual/en/reserved.variables.server.php

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

于 2012-08-10T00:25:38.060 回答
0

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

于 2012-08-10T00:30:06.830 回答