文档根不显示

时间:2012-01-26 04:32:29

标签: php

我有一个脚本,它使用其所有其他包含文件的绝对路径;该脚本将作为一个cron作业执行。当我在终端中运行脚本时,$_SERVER["DOCUMENT_ROOT"]返回一个空值,但在浏览器中它返回正确的文档根。

什么会导致这个问题?

5 个答案:

答案 0 :(得分:6)

您的问题是执行环境提供了$_SERVER个变量。在命令行上运行脚本时,没有HTTP服务器。

所以,你不能使用像DOCUMENT_ROOT这样的东西 - 当没有Apache配置设置它时会是什么呢?

相反,您可以使用__FILE__之类的变量,这是脚本的完整路径。这一次或多次的dirname可能会让您进入DOCUMENT_ROOT

答案 1 :(得分:1)

我希望只有当脚本实际在网络服务器上运行时才定义$_SERVER,而不是在独立命令行PHP解释器运行时。该值仅在服务器上下文中有意义。如果脚本要作为cron作业运行,则不应该依赖该变量。

答案 2 :(得分:1)

当在CLI模式下执行php时,它的行为会有所不同,包括不设置$_SERVER['DOCUMENT_ROOT']。有关$_SERVER值和命令行中可用的其他工具的良好列表,请尝试执行<?php echo phpinfo();

作为CLI脚本,您仍然可以访问__FILE__以查找您正在运行的文件。

答案 3 :(得分:1)

如果您正在使用Magento而不是使用

  

$ _ SERVER [&#34; DOCUMENT_ROOT&#34;]

  

realpath(dirname(__FILE__))

我建议你使用

  

目录名(法师:: getRoot())

这将为您提供Magento商店的根文件夹,希望这会有所帮助。

干杯 小号

答案 4 :(得分:0)

我需要在不同的服务器环境中执行相同的脚本,并且遇到了查找站点的公共根目录的问题,尤其是使用命令行php。我厌倦了编辑路径,所以我编写了一个函数,在我的所有服务器环境中查找根。我相信有更好的方法,但对我来说效果很好。 它工作的目录结构的一些例子:

'/var/www/magento/some/folder/'
'/home/user/html/some/folder/'
'/home/user/public_html/some/folder/'


function getSiteRoot() {
    /*
    ' Returns the root of any of your development/live site as long as the $home array
    ' contains a unique folder name. Define your public directories in this array and the
    ' building function will break when it hits this directory.
    */
    $a = realpath(dirname(__FILE__).'');
    $b = explode('/', $a);
    $home = array("html","public_html","magento"); //add your public folders here
    $str = '';
    foreach ($b as $c) {
        $str.= $c . DIRECTORY_SEPARATOR . '';
            if(in_array($c, $home)) {
                break;
            }
    }
    return $str;
}