2014-01-04 1 views
2

У меня есть приложение ZF2, работающее с веб-сервера должным образом. Мне нужно выполнить некоторые действия из командной строки, потому что я хочу выполнить запланированную задачу (задания cron).Runnig Zend Framework 2 действие с консоли не работает

Итак, я нашел эти полезные ссылки: Zend Framework's official document, Samsonasik's blog. Я начал с добавления консольного маршрута на module.config.php в модуле GeneratePdf. Вот сегмент консольного маршрута.

'console' => array(
    'router' => array(
     'routes' => array(
      'generate' => array(
       'options' => array(
        'route' => 'generate all [--verbose|-v]', 
        'defaults' => array(
         '__NAMESPACE__' => 'GeneratePdf\Controller', 
         'controller' => 'GeneratePdf', 
         'action' => 'generateAll' 
        ), 
       ), 
      ), 
     ) 
    ) 
), 

У меня есть действие на классе контроллера GeneratePdf, вот сегмент код этого действия:

public function generateAllAction() { 
    die('Is it working?'); 
    set_time_limit(150000); 

    // reading directory 
    $d = dir('public/pdf/'); 

    $files = array(); 
    while (($file = $d->read()) !== false) { 
     $files [] = $file; 
    } 
    $d->close(); 

Я не включил весь код выше действий, поскольку он имеет много линий. Он правильно работает из веб-браузера.

Чтобы запустить из консоли, я вошел в этой команде в моем убунте 13.10 в терминале:

php public/index.php generate all -v 

Я получил кучу трассировки стеки ошибок на моем терминале:

PHP Notice: Undefined index: APPLICATION_ENV in /var/www/zf2-reporting/publi/index.php on line 11 
PHP Stack trace: 
PHP 1. {main}() /var/www/zf2-reporting/public/index.php:0 
PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /var/www/zf2-reporting/module/Application/Module.php on line 93 
PHP Stack trace: 
PHP 1. {main}() /var/www/zf2-reporting/public/index.php:0 
PHP 2. Zend\Mvc\Application->run() /var/www/zf2-reporting/public/index.php:32 
PHP 3. Zend\EventManager\EventManager->trigger() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php:290 
PHP 4. Zend\EventManager\EventManager->triggerListeners() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php:207 
PHP 5. call_user_func() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php:468 
PHP 6. BjyAuthorize\Guard\Controller->onDispatch() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php:468 
PHP 7. Zend\EventManager\EventManager->trigger() /var/www/zf2-reporting/module/BjyAuthorize/src/BjyAuthorize/Guard/Controller.php:176 
PHP 8. Zend\EventManager\EventManager->triggerListeners() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php:207 
PHP 9. call_user_func() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php:468 
PHP 10. Application\Module->Application\{closure}() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php:468 
PHP 11. Zend\ServiceManager\ServiceManager->get() /var/www/zf2-reporting/module/Application/Module.php:44 
PHP 12. Zend\ServiceManager\ServiceManager->create() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:480 
PHP 13. Zend\ServiceManager\ServiceManager->doCreate() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:556 
PHP 14. Zend\ServiceManager\ServiceManager->createFromFactory() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:597 
PHP 15. Zend\ServiceManager\ServiceManager->createServiceViaCallback() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:984 
PHP 16. call_user_func() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:852 
PHP 17. Application\Module->Application\{closure}() /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:852 
PHP 18. date() /var/www/zf2-reporting/module/Application/Module.php:93 
PHP Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.' in /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/Log/Logger.php:399 
Stack trace: 
#0 /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/Log/Logger.php(399): DateTime->__construct() 
#1 /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/Log/Logger.php(451): Zend\Log\Logger->log(2, Object(BjyAuthorize\Exception\UnAuthorizedException), Array) 
#2 /var/www/zf2-reporting/module/Application/Module.php(44): Zend\Log\Logger->crit(Object(BjyAuthorize\Exception\UnAuthorizedException)) 
#3 [internal function]: Applicat in /var/www/zf2-reporting/vendor/zendframework/zendframework/library/Zend/Log/Logger.php on line 399 

Он бросает undefined index в супер-глобальной переменной $ _SERVER "APPLICATION_ENV" в файле index.php. Я определил среду приложения в файле виртуального хоста моего сайта. Он правильно работает в браузере. Если я переключу среду приложения, она будет работать. Другой проблемой является PHP Warning: date().

Я правильно определил дату в своем php.ini. Вот оно:

date.timezone = Asia/Kathmandu 

Хотя это не большая проблема, я могу передать дату, используя эту функцию на index.php:

date_default_timezone_set("Asia/Kathmandu"); 

Я также попытался установить APPLICATION_ENV прямо в index.php по следующий фрагмент кода:

if(!isset($_SERVER['APPLICATION_ENV'])){ 
    $_SERVER['APPLICATION_ENV'] = 'development'; 
} 

Когда я снова огонь эту команду: PHP общественности/index.php генерировать все -v

У меня нет вывода в терминале. И он не печатает этот текст: «Он работает?» который находится в функции die первой строки моего файла действия. Я полностью путаюсь с выходом. Отлаживать нечего. Я имею в виду, что это не вызывает никаких ошибок, поэтому как я могу его отладить.

Я совершенно не знаю, как передать APPLICATION_ENV из командной строки или могут быть другие варианты его установки. Я также попытался установить путь в файле bashrc, но он тоже не работает.

Я думаю, что рассмотрел все необходимые разделы кода/ошибки в этом вопросе. Если что-то не хватает, пожалуйста, скажите мне. :)

Спасибо.

ответ

3

Виртуальный хост не находится на этапе запуска вашего приложения с консоли, потому что это не HTTP-запрос. Это запрос CLI.

Определите переменную APPLICATION_ENV в ~ ~.Bashrc файл что-то вроде этого:

export APPLICATION_ENV="development" 

UPDATE: Не забудьте перезагрузить ваш файл профиля после редактирования:

source ~/.bashrc 

Кроме того, некоторые системы (например, Ubuntu) использует другой файл php.ini для CLI. Например, на моем личном сервере у меня есть два файла php.ini, например, следующие:

/etc/php5/fpm/php.ini 
/etc/php5/cli/php.ini // This is CLI 

Последнее, что есть; написать имя действия в конфигурации маршрутизации тира отделенного notCamelcased:

'action' => 'generateAll' // WRONG 
'action' => 'generate-all' // CORRECT 
+0

Привет Foozy, я экспортировал APPLICATION_ENV, установить часовой пояс кли php.ini и последний one: 'action' => 'generate-all'. Эти предупреждения ушли, но все же он показывает пустой вывод. Есть ли еще что-то, что мне нужно проверить, пожалуйста, предоставьте меня. Спасибо – regeint

+0

Что вы подразумеваете под пустым выпуском? Ваша диспетчеризация generateAllAction? – edigu

+0

Процесс не достигает режима cli generateAllAction, но его можно получить из веб-браузера. – regeint

-1

На вершине public/index.php сайта:

if (! getenv('APPLICATION_ENV')) { 
    putenv('APPLICATION_ENV=dev'); 
} 
Смежные вопросы