Я создаю модуль генератора искателя сайта/файла 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()
Верно, что запуск 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-адреса в консольном режиме. Но теперь не уверен, как вы видите, я использую оба.
Эта ошибка восходит к основному пониманию использования PHP и его развертыванию в веб-среде и в качестве обычного PHP-скрипта, поэтому я хотел бы настоятельно рекомендовать вам ознакомиться с этими понятиями, чтобы преодолеть текущую проблему.
Когда вы запускаете PHP-скрипт в веб-среде, веб-сервер (пример Apache) предоставляет некоторые данные, которые PHP предоставляет вашему скрипту через супер-глобальную переменную $ _SERVER.
В принципе, когда вы запускаете PHP-скрипт из командной строки, нет веб-сервера, поэтому переменная $ _SERVER недоступна.
Чтобы получить имя сервера, используйте
$myServer = gethostname()
@apoq опубликовал связанный вопрос, который имеет ряд альтернатив, которые вы можете использовать. потребуется некоторое время, чтобы прочитать этот пост.
gethostname()
и php_uname('n')
. Я ожидал, что переменная $_SERVER
все еще будет доступна, так как модуль все еще является частью веб-приложения, а консольные приложения Yii по-прежнему используют базовую инфраструктуру Yii.