如何以编程方式确定PHP中的文档根?

时间:2008-12-23 22:43:20

标签: php apache configuration

这是我最近遇到的一个问题 - 在虚拟主机上配置错误的apache。这意味着所有依赖$_SERVER['DOCUMENT_ROOT']的脚本都会中断。我发现最简单的解决方法是在一些共享的全局包含文件中设置变量,但不要忘记它是一种痛苦。我的问题是,如何以编程方式确定正确的文档根?

例如,在一台主机上,设置如下:

$_SERVER['DOCUMENT_ROOT'] == '/htdocs'

真正的文件根源是:

test.example.com -> /data/htdocs/example.com/test
www.example.com -> /data/htdocs/example.com/www

我想要一个从www.example.com/blog/(在路径/data/htdocs/example.com/www/blog上)运行的脚本,以获得/data/htdocs/example.com/www的正确值。

在另一台主机上,设置略有不同:

$_SERVER['DOCUMENT_ROOT'] == '/srv'
test.example.com -> /home/virtual_web/example.com/public_html/test
www.example.com -> /home/virtual_web/example.com/public_html/www

这有什么解决方案吗?或者只是不依赖$_SERVER['DOCUMENT_ROOT']并修复我在我的网站上运行的所有软件的唯一方法?在托管方面修复这个似乎不是一个选项,我还没有遇到正确配置的主机。我得到的最好的是一个指向www.example.com的文档根,至少在open_basedir中 - 他们使用了另一个命名方案,www.example.com将指向/u2/www/example_com/data/www/

6 个答案:

答案 0 :(得分:7)

在PHP5中,有一个魔术常量__FILE__,它包含出现的文件的绝对路径。您可以将它与dirname结合使用来计算文档根目录。

您可以在配置文件

中添加如下语句
define ('DOCUMENT_ROOT', dirname(__FILE__));

这应该可以解决问题

答案 1 :(得分:3)

无需修改所有脚本。

您可以在使用auto_prepend_file运行任何脚本之前运行PHP文件。

$_SERVER只是一个数组,您可以修改它并设置正确的$_SERVER['DOCUMENT_ROOT']

答案 2 :(得分:2)

这就是为什么人们使用htaccess和/或查询字符串通过bootstrap /index.php来虹吸一切的原因之一。您可以使用上面提到的dirname( __FILE__ )技巧,以此方式获取应用的公共基础。

如果你太过分切换到一个入口点,我看到人们做的一件事就是在他们的脚本上有一个共同的标题,它在目录树中走来找到一个独特的文件。基地目录:

function findAppBase( $dir ) {
    if( file_exists( "$dir/unique_file.txt" ) ) {
        return $dir;

    return findAppBase( dirname( $dir ) );
}

$base = findAppBase( dirname( __FILE__ ) );

该代码尚未经过测试,并且使用$_ENV$_SERVER中的vars可能会采用一种更为流畅的方式来实现您想要的...

答案 3 :(得分:2)

基于http://www.helicron.net/php/

$localpath=getenv("SCRIPT_NAME");
$absolutepath=getenv("SCRIPT_FILENAME");
$_SERVER['DOCUMENT_ROOT']=substr($absolutepath,0,strpos($absolutepath,$localpath));     

我不得不更改basename / realpath技巧,因为它在我的主机上返回了一个空字符串。相反,我使用SCRIPT_FILENAME。这可能不再适用于IIS(但使用$ _SERVER变量的原始脚本可能也不会)。

答案 4 :(得分:0)

PHP 将当前目录设置为脚本所在的目录,因此只要不破坏,您就应该能够使用$_SERVER['SCRIPT_FILENAME']和{找出文档根目录{1}}。 (我不记得我脑子里的所有$ _SERVER变量,phpinfo()中可能有更多有用的东西。)

答案 5 :(得分:0)

为什么不要求您的webhost正确配置他的服务器?

这些东西往往会在你的代码中默默地存在,并且永远不会被删除(但仍然有效),直到有人最终修复了服务器。一切都会再次破裂。

或者,将您的资料转移到可以使用的主机上。如果这被打破了,谁知道你接下来会发现什么。