繁体   English   中英

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

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

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

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

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

(注意:以下部分中的文件路径是相对于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在基金目录中包含几个函数页面,它们是/core/core/func/userfunctions.php (如/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/ you /there/are/so/many/paths/in/the/url/of/this/ page中的包含仍在工作时,您会非常高兴!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM