【问题标题】:Is it a good idea to use $_SERVER['DOCUMENT_ROOT'] in includes?在包含中使用 $_SERVER['DOCUMENT_ROOT'] 是个好主意吗?
【发布时间】:2012-08-07 07:02:31
【问题描述】:

例如,这是个好主意吗?

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

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

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

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

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

【问题讨论】:

    标签: php


    【解决方案1】:

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

    【讨论】:

    • 这对我不起作用。我只是使用:include '..\wp-load.php'; 因为我的项目与 wp-includes、wp-content、ap-admin...位于同一目录中...
    • @FranciscoCorralesMorales include dirname(__FILE__) . '/../../other/file.php'; 是正确的做法。这是因为 PHP 会查找当前工作目录 (cwd),然后附加 '..\wp-load.php';,这可能并不总是如您预期的那样工作。在此处阅读有关 getcwd 的更多信息:http://php.net/manual/en/function.getcwd.php
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我不确定我是否完全解释了自己。我会更新我的问题。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-08-12
      • 1970-01-01
      • 2015-12-04
      • 2017-12-29
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多