Как зарегистрировать неперехваченные исключения в PHP?
-
09-06-2019 - |
Вопрос
Я научился преобразовывать ошибки в исключения и прекрасно отображаю их, если они не обнаружены, но я не знаю, как их полезно регистрировать.Просто записать их в файл бесполезно, не так ли?И рискнули бы вы получить доступ к базе данных, если еще не знаете, что вызвало исключение?
Решение
мне действительно нравится log4php для логирования, хотя он еще не вышел из инкубатора.Я использую log4net практически во всем, и этот стиль кажется мне вполне естественным.
Что касается сбоев системы, вы можете зарегистрировать ошибку в нескольких местах назначения (например, иметь приложения с пороговым значением КРИТИЧЕСКИЙ или ОШИБКА, которые вступают в действие только тогда, когда что-то идет не так).Я не уверен, насколько отказоустойчивы существующие приложения - если база данных не работает, как это приложение выйдет из строя? - но вы можете довольно легко написать свое собственное приложение, которое будет корректно работать со сбоем, если оно не сможет войти в журнал.
Другие советы
Вы могли бы использовать set_error_handler чтобы установить собственное исключение для регистрации ваших ошибок.Лично я бы рассмотрел возможность хранения их в базе данных, поскольку обратная трассировка обработчика исключений по умолчанию может предоставить информацию о том, что их вызвало - это, конечно, будет невозможно, если обработчик базы данных инициировал исключение.
Вы также можете использовать журнал ошибок для регистрации ваших ошибок.Он имеет выбор пунктов назначения сообщений, включая:
Цитата: журнал ошибок
- Системный регистратор PHP, использующий механизм системного журналирования операционной системы или файл, в зависимости от того, какое значение установлено в директиве конфигурации error_log.Это опция по умолчанию.
- Отправляется по электронной почте на адрес, указанный в параметре назначения.Это единственный тип сообщения, в котором используется четвертый параметр extra_headers.
- Добавляется к месту назначения файла.Новая строка не добавляется автоматически в конец строки сообщения.
Редактировать:Есть ли в уценке тег noparse для подчеркивания?
Просто записать их в файл бесполезно, не так ли?
Но, конечно, это здорово, гораздо лучше, чем отображать их на экране.Вы хотите показать пользователю красивый экран с надписью «Извините, мы облажались.Инженеры были уведомлены.Вернитесь и попробуйте еще раз» и АБСОЛЮТНО НИКАКИХ ТЕХНИЧЕСКИХ ПОДРОБНОСТЕЙ, потому что это будет угрозой безопасности.Вы можете отправить электронное письмо в общий почтовый ящик и зарегистрировать исключение в файле или базе данных для последующего просмотра.Это было бы лучшей практикой.
Я бы записал их в файл и, возможно, установил бы систему мониторинга для проверки изменений в размере файла или дате последнего изменения.Webmin — это простой способ, но существуют и более полные программные решения.
Если вы знаете, что это разовая ошибка, отправьте уведомление по электронной почте.Однако на веб-сайте с большим количеством посещений в минуту не всегда отправить уведомление по электронной почте.Я видел, как веб-сайт отключился из-за того, что в минуту генерировались сотни электронных писем с сообщением о том, что система не может подключиться к базе данных.Тот факт, что у него также было значение LoadAvg> 200 из-за того, что почтовый сервер запускался для каждого нового сообщения, совсем не помогло.В этом случае лучшим сценарием, безусловно, была проверка сторожевого таймера на наличие файлов и подключение к внешней службе для отправки SMS (возможно, мгновенного сообщения) или использование внешней системы для поиска на веб-странице сообщения об ошибке (которое не обязательно должно быть видно на экране — оно может быть в комментарии HTML).
Я думаю, что это во многом зависит от того, где произошла ваша ошибка.Если БД не работает, регистрация ее в БД — не лучшая идея;)
Я использую системный журнал() функция для регистрации ошибки, но у меня нет проблем с записью ее в файл, когда я работаю в системе, которая не поддерживает системный журнал.Вы можете легко настроить свою систему для отправки вам электронной почты или сообщения Jabber, например, используя logwatch или стандартный системный журнал.
Вы также можете перехватывать и записывать исключения PHP с помощью Google Forms.Есть учебник здесь это объясняет процесс.