【问题标题】:can I change value of $_SERVER['DOCUMENT_ROOT']?我可以更改 $_SERVER['DOCUMENT_ROOT'] 的值吗?
【发布时间】:2012-01-11 22:32:40
【问题描述】:

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

现在,所有的包含文件都没有被找到,因为它们被引用了

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

等等。

没有设置一个全新的主机帐户只是为了测试这个特定的客户,我可以更改$_SERVER['DOCUMENT_ROOT']的值以包含文件所在的子文件夹iftc ?

【问题讨论】:

  • 如果您可以在您的主机帐户中创建一个子域,它应该有自己的文档根目录。
  • 我想这就是我要做的,最终根据下面的“我的首选解决方案”重写代码
  • 我开始使用 __dir__ 作为预先添加路径的一种方式,这至少为相对路径带来了一些一致性——只要一切都使用 __dir__

标签: php


【解决方案1】:

只需在此站点的 Apache 配置的 VirtualHost 部分更改 DocumentRoot /your/desired/path/。文档是here

【讨论】:

    【解决方案2】:

    我的首选解决方案

    有几种方法可以做到这一点,但最好的方法是通过简单的函数调用来简单地查找和替换 $_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 中进行。

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

    【讨论】:

    • 除非你对包含get_my_path()的文件的路径有问题
    【解决方案3】:

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

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

    php_value auto_prepend_file ./override_docroot.php
    

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-12
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        • 2011-11-05
        相关资源
        最近更新 更多