Я создаю решение для мониторинга для регистрации ошибок PHP, неперехваченных исключений и всего остального, которые пользователь хочет выполнить для входа в таблицу базы данных. Вид замены решения для мониторинга на коммерческом сервере Zend.
Я написал класс Monitor, который расширяет Zend_Log и может обрабатывать все упомянутые случаи. Моя цель – уменьшить конфигурацию до одного места, что будет Bootstrap. На данный момент я инициализирую монитор следующим образом:
protected function _initMonitor() { $config = Zend_Registry::get('config'); $monitorDb = Zend_Db::factory($config->resources->db->adapter, $config->resources->db->params); $monitor = new Survey_Monitor(new Zend_Log_Writer_Db($monitorDb, 'logEntries'), $config->projectName); $monitor->registerErrorHandler()->logExceptions(); }
Метод registerErrorHandler () позволяет регистрировать ошибки php в БД, метод logExceptions () является расширением и просто устанавливает защищенный флаг.
В ErrorController errorAction я добавляю следующие строки:
//use the monitor to log exceptions, if enabled $monitor = Zend_Registry::get('monitor'); if (TRUE == $monitor->loggingExceptions) { $monitor->log($errors->exception); }
Я хотел бы избежать добавления кода в ErrorController, хотя я бы скорее зарегистрировал плагин динамически. Это облегчило бы интеграцию в существующие проекты для пользователя.
Вопрос: Могу ли я зарегистрировать плагин контроллера, который использует крюк postDispatch и достигнет такого же эффекта? Я не понимаю, какие события запускают errorAction, если на нескольких этапах схемы есть несколько событий, нужно ли мне использовать несколько перехватчиков?
Зарегистрируйте свой плагин с индексом стека 101. Проверьте исключения в объекте ответа на routeShutdown и postDispatch.
$response = $this->getResponse(); if ($response->isException()) { $exceptions = $response->getException(); }
чтобы проверить, было ли исключено исключение внутри цикла обработчика ошибок, вы должны отправить диспетчер () в блок try-catch
Принятый ответ Xerkus заставил меня на правильном пути. Однако я хотел бы добавить дополнительную информацию о моем решении.
Я написал плагин контроллера, который выглядит так:
class Survey_Controller_Plugin_MonitorExceptions extends Zend_Controller_Plugin_Abstract { public function postDispatch(Zend_Controller_Request_Abstract $request) { $response = $this->getResponse(); $monitor = Zend_Registry::get('monitor'); if ($response->isException()) { $monitor->log($response); } } }
Обратите внимание, что вы получаете экземпляр массива из Zend_Exception, если используете $ response-> getException (). После того, как я это понял, я просто добавил цикл foreach к моему методу logger, который записывает каждое исключение для записи отдельно.
Теперь почти все работает так, как ожидалось. На данный момент я все еще получаю два одинаковых исключения, которые не то, что я ожидал бы. Мне нужно будет изучить это через другой вопрос о SO.