我可以更改$ _SERVER ['DOCUMENT_ROOT']的值吗?

时间:2011-12-02 23:39:42

标签: php

我正在为已经由其他人编程的应用程序的客户端项目设置测试环境。我在主机帐户中创建了一个名为iftc的子目录,我们通常将其用于此类目的。

现在,找不到所有包含文件,因为它们是通过

引用的
include($_SERVER['DOCUMENT_ROOT'].'/Includes/Connect.php'); 

等等。

如果仅为此特定客户端的测试目的设置全新主机帐户,我是否可以某种方式更改$_SERVER['DOCUMENT_ROOT']的值以包含子文件夹iftc文件在?

4 个答案:

答案 0 :(得分:8)

我的首选解决方案

有几种方法可以做到,但最好的方法是通过简单的函数调用来查找和替换$_SERVER['DOCUMENT_ROOT']的所有用法。

所以你的例子会变成:

include(get_my_path() . '/Includes/Connect.php');

定义您当前的运行模式:

define('RUN_MODE_PRODUCTION', true); // in live mode
define('RUN_MODE_PRODUCTION', false); // debug mode

现在进行功能定义:

function get_my_path() {
    if(RUN_MODE_PRODUCTION === true) {
        return '/my/path/';
    }
    return '/my/other/path';
}

覆盖$_SERVER中的实际值是个坏主意。如果其他人后来开始研究该项目,那么目前尚不清楚发生了什么。

这是我每天在制作中使用的环境引导的非常简化的版本。

你无法做到的地方

另一种方法可以做到

当我设置我的大规模虚拟环境进行开发时,我遇到了这个问题。见http://blog.simonholywell.com/post/1516566788/team-development-server#virtual_document_root

因为我无法使用上述任何一种方法覆盖$_SERVER['DOCUMENT_ROOT'],所以我必须在auto_prepend_file中执行此操作。

我不建议您使用此技术来解决此特定问题,因为在这种情况下,在应用程序级别可以更好地解决此问题。

答案 1 :(得分:1)

您无法在PHP之前更改DOCUMENT_ROOT环境变量。 (除非你摆弄CGI包装脚本) Apache有SetEnv指令,但这不适用于DOCUMENT_ROOT(CGI env的特殊要求)。可以给它一个替代名称DOC_ROOT2等。

但是你可以使用php.ini auto_prepend_file设置在PHP中全局覆盖该变量,也可以使用.htaccess再次设置:

php_value auto_prepend_file ./override_docroot.php

然后该脚本将“全局”适应您的环境:

<?php
   $_SERVER["DOCUMENT_ROOT"] = "..."; 

答案 2 :(得分:0)

这是通过Web服务器配置的,而不是通过PHP配置的。例如,在Apache中,它是DocumentRoot指令。

为什么不使用相对路径呢?如果您使用../Includes/Connect.php等路径,则可以完全独立于应用程序所在的位置。

答案 3 :(得分:0)

只需更改此站点的Apache配置的VirtualHost部分中的DocumentRoot /your/desired/path/即可。文档为here