Yii CConsoleCommand不支持$ _SERVER变量?

时间:2015-01-31 17:41:58

标签: php yii cron

我正在制作一个网站抓取工具/网站地图生成器模块,该模块需要能够在CRON上运行。我已经完成了所有事情,而且我正处于需要ping搜索引擎我的新站点地图文件的阶段。我的模块有一个Web界面,ping可以正常工作,但由于它需要在CRON上运行,我创建了一个运行它的CConsoleCommand

所以,我得到的问题是我将$_SERVER['SERVER_NAME']变量传递给ping操作。并且CConsoleCommandUndefined index: SERVER_NAME上抛出错误。

现在,我试过了:

$_SERVER['HTTP_HOST']
$_SERVER['SERVER_NAME']
Yii::app()->request->getBaseUrl(true) //returns absolute URL

但他们都会在SERVER_NAME上抛出错误。 CConsoleCommand是否不支持这些变量?

C:\xampp\htdocs\YiiCrawler>protected\yiic crawler-sitemap crawl
PHP Error[8]: Undefined index: SERVER_NAME
    in file C:\xampp\htdocs\YiiCrawler\yii-1.1.16.bca042\framework\web\CHttpRequest.php at line 344
#0 C:\xampp\htdocs\YiiCrawler\yii-1.1.16.bca042\framework\web\CHttpRequest.php(392): CHttpRequest->getHostInfo()
#1 C:\xampp\htdocs\YiiCrawler\protected\modules\AvocadoCrawler\commands\ConsoleCrawlerCommand.php(26): CHttpRequest->getBaseUrl()
#2 unknown(0): ConsoleCrawlerCommand->actionCrawl()
#3 C:\xampp\htdocs\YiiCrawler\yii-1.1.16.bca042\framework\console\CConsoleCommand.php(172): ReflectionMethod->invokeArgs()
#4 C:\xampp\htdocs\YiiCrawler\yii-1.1.16.bca042\framework\console\CConsoleCommandRunner.php(71): ConsoleCrawlerCommand->run()
#5 C:\xampp\htdocs\YiiCrawler\yii-1.1.16.bca042\framework\console\CConsoleApplication.php(92): CConsoleCommandRunner->run()
#6 C:\xampp\htdocs\YiiCrawler\yii-1.1.16.bca042\framework\base\CApplication.php(184): CConsoleApplication->processRequest()
#7 C:\xampp\htdocs\YiiCrawler\yii-1.1.16.bca042\framework\yiic.php(33): CConsoleApplication->run()
#8 C:\xampp\htdocs\YiiCrawler\protected\yiic.php(7): require_once()

2 个答案:

答案 0 :(得分:0)

这个错误可以追溯到理解PHP的使用,它在Web环境中的部署以及作为普通的PHP脚本的基础,因此我建议您查看这些概念以了解当前问题。

当您在Web环境中运行PHP脚本时,Web服务器(示例Apache)会提供一些数据,PHP通过$ _SERVER超全局变量向您的脚本公开。

基本上,当您从命令行运行PHP脚本时,没有Web服务器,因此$ _SERVER变量不可用。

要获取服务器名称,请使用

$myServer = gethostname()

@apoq发布了一个链接问题,其中包含许多您可以使用的替代方案。花点时间阅读那篇文章。

答案 1 :(得分:0)

在控制台模式下运行php意味着您没有可用的$ _SERVER变量。

在我的情况下,我确实伪造了它,强行将它放在console.php的开头:

$_SERVER['SERVER_NAME']='www.example.com';

然后在组件中我还编辑了请求的hostInfo:

...

// application components
    'components'=>array(

        'request' => array(
            'hostInfo' => (_USE_SSL_?"https://":"http://")."{$_SERVER['SERVER_NAME']}",
            'baseUrl' => "",
            'scriptUrl' => '',
        ),
...

我认为你可以跳过$_SERVER['SERVER_NAME']伪造,然后定义hostInfo,这应该让Yii在控制台模式下生成网址。但现在还不确定,因为你看到我同时使用它们。