У меня есть приложение ZF2, запущенное с веб-сервера должным образом. Мне нужно выполнить некоторые действия из командной строки, потому что я хочу выполнить запланированную задачу (задания cron).
Поэтому я нашел эти полезные ссылки: официальный документ Zend Framework , блог Samsonasik . Я начал с добавления консольного маршрута на 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();
Я не включил весь код вышеупомянутого действия, потому что у него много строк. Он правильно работает из веб-браузера.
Чтобы запустить с консоли, я ввел эту команду в свой терминал ubuntu 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
Он бросает неопределенный индекс в супер-глобальную переменную $ _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 public / index.php генерирует все -v
У меня нет выхода в терминале. И он не печатает этот текст: «Он работает?» который находится в функции die первой строки моего файла действия. Я полностью путаюсь с выходом. Отлаживать нечего. Я имею в виду, что это не вызывает никаких ошибок, поэтому как я могу его отладить.
Я совершенно не знаю, как передать APPLICATION_ENV из командной строки или могут быть другие варианты его установки. Я также попытался установить путь в файле bashrc, но он тоже не работает.
Я думаю, что я затронул все необходимые разделы кода / ошибки в этом вопросе. Если что-то не хватает, пожалуйста, скажите мне. 🙂
Спасибо.
Виртуальный хост не находится на этапе запуска вашего приложения с консоли, потому что это не 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
В дополнение к public/index.php
:
if (! getenv('APPLICATION_ENV')) { putenv('APPLICATION_ENV=dev'); }