Yii CConsoleCommand не поддерживает переменные $ _SERVER?

0

Я создаю модуль генератора искателя сайта/файла Sitemap, который должен работать на CRON. Я закончил все, и я нахожусь на том этапе, где мне нужно, чтобы ping поисковых систем мой новый файл Sitemap. Мой модуль имеет веб-интерфейс, и ping отлично работает оттуда, но поскольку он должен работать на CRON, я сделал CConsoleCommand который запускает его.

Итак, проблема, которую я получаю, заключается в том, что я $_SERVER['SERVER_NAME'] переменную $_SERVER['SERVER_NAME'] в действие ping. И CConsoleCommand ошибку об Undefined index: SERVER_NAME.

Теперь я пробовал:

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

Но все они SERVER_NAME ошибки на 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()
  • 0
    см. stackoverflow.com/questions/626416/…
  • 0
    @apoq, спасибо, но не совсем тот ответ, который я искал.
Показать ещё 1 комментарий
Теги:
cron
yii

2 ответа

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 генерировать URL-адреса в консольном режиме. Но теперь не уверен, как вы видите, я использую оба.

  • 0
    Спасибо за ответ, вы подошли близко к тому, что мне нужно, но я бы предпочел не делать этого жестко. Если нет другого решения, я реализую переменную конфигурации, которую нужно будет менять от экземпляра к экземпляру.
0

Эта ошибка восходит к основному пониманию использования PHP и его развертыванию в веб-среде и в качестве обычного PHP-скрипта, поэтому я хотел бы настоятельно рекомендовать вам ознакомиться с этими понятиями, чтобы преодолеть текущую проблему.

Когда вы запускаете PHP-скрипт в веб-среде, веб-сервер (пример Apache) предоставляет некоторые данные, которые PHP предоставляет вашему скрипту через супер-глобальную переменную $ _SERVER.

В принципе, когда вы запускаете PHP-скрипт из командной строки, нет веб-сервера, поэтому переменная $ _SERVER недоступна.

Чтобы получить имя сервера, используйте

$myServer = gethostname()

@apoq опубликовал связанный вопрос, который имеет ряд альтернатив, которые вы можете использовать. потребуется некоторое время, чтобы прочитать этот пост.

  • 0
    спасибо, но за ответ, но это не то, что мне нужно. Мне не нужно имя сервера, которое возвращается gethostname() и php_uname('n') . Я ожидал, что переменная $_SERVER все еще будет доступна, так как модуль все еще является частью веб-приложения, а консольные приложения Yii по-прежнему используют базовую инфраструктуру Yii.
  • 0
    Пожалуйста, прочитайте еще раз <Поскольку исходный код находится в структуре корневого веб-каталога, это не означает, что $ _SERVER доступен. $ _SERVER доступен через веб-сервер, и при запуске сценария командной строки веб-сервер отсутствует, поэтому переменные сервера недоступны. То, что вы просите, недоступно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню