我有一个脚本,它使用它到所有其他包含文件的绝对路径;脚本将作为cron作业执行。当我在终端中运行脚本时,$_SERVER["DOCUMENT_ROOT"]
返回一个null值,但在浏览器中它返回正确的文档根。
是什么原因导致了这个问题?
您的问题是$_SERVER
变量是由执行环境提供的。当您在命令行上运行脚本时,没有HTTP服务器。
所以,你不能使用像DOCUMENT_ROOT
这样的东西——如果没有Apache配置设置它,那会是什么?
相反,您可以使用__FILE__
这样的变量,它是脚本的完整路径。也许一次或多次的dirname
会让你到达DOCUMENT_ROOT
。
我希望只有当脚本实际在Web服务器中运行时才能定义$_SERVER
,而不是当它由独立的命令行PHP解释器运行时。该值只有在服务器上下文中才有意义。如果脚本是作为cron作业运行的,那么它不应该依赖于该变量。
当php在CLI模式下执行时,它的行为会有所不同,包括不设置$_SERVER['DOCUMENT_ROOT']
。要获得命令行中可用的$_SERVER
值和其他工具的良好列表,请尝试执行<?php echo phpinfo();
作为CLI脚本,您应该仍然可以访问__FILE__
,以了解您正在运行的文件是什么。
如果您正在使用Magento,则不要使用
$_SERVER["DOCUMENT_ROOT"]
或
realpath(dirname(__FILE__))
我建议你使用
目录名(Mage::getRoot())
这将给你的Magento存储的根文件夹,希望这有帮助。
干杯S
我需要在不同的服务器环境中执行相同的脚本,并且遇到了查找站点的公共根的问题,尤其是使用命令行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;
}