例如,这是一个好主意吗?
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
中所示)。
因此,在init.php中,我可以使用$_SERVER
方法,因为如果我使用相对路径并尝试从/dir/file.php
这样的页面调用函数,它会中断。
我看不出有任何问题,但总的来说可能出现什么问题?
答案 0 :(得分:9)
我见过$_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']));
答案 1 :(得分:2)
您不需要这样做。 PHP默认情况下在文档根目录中查找包含的文件。
您可以使用set_include_path($new_include_path)更改此行为,或在php配置文件中编辑include_path。
此外,来自http://php.net/manual/en/reserved.variables.server.php:
'DOCUMENT_ROOT' 正在执行当前脚本的文档根目录,如服务器配置文件中所定义。
答案 2 :(得分:0)
例如,如果您使用网址重写,当您发现/there/are/so/many/paths/in/the/url/of/this/
页面中的包含仍然有效时,您会非常高兴!