我有一个脚本,它使用其所有其他包含文件的绝对路径;该脚本将作为一个cron作业执行。当我在终端中运行脚本时,$_SERVER["DOCUMENT_ROOT"]
返回一个空值,但在浏览器中它返回正确的文档根。
什么会导致这个问题?
答案 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;
}