Как мне регистрировать необработанные исключения в PHP? - PullRequest
11 голосов
/ 21 августа 2008

Я узнал, как преобразовывать ошибки в исключения, и я красиво отображаю их, если они не обнаружены, но я не знаю, как их удобно регистрировать Просто записать их в файл не будет полезно, не так ли? И рискнули бы вы получить доступ к базе данных, когда еще не знаете, что вызвало исключение?

Ответы [ 7 ]

11 голосов
/ 21 августа 2008

Вы можете использовать set_error_handler , чтобы установить пользовательское исключение для регистрации ваших ошибок. Я бы лично подумал о том, чтобы сохранить их в базе данных, поскольку обратная трассировка обработчика исключений по умолчанию может предоставить информацию о том, что его вызвало - однако, конечно, это будет невозможно, если обработчик базы данных вызовет исключение.

Вы также можете использовать error_log для регистрации ваших ошибок. У него есть выбор адресатов сообщений, включая:

Цитируется из error_log

  1. Системный журнал PHP, использующий механизм системного журнала операционной системы или файл, в зависимости от того, на что установлена ​​директива конфигурации error_log. Это опция по умолчанию.
  2. Отправляется по электронной почте на адрес, указанный в параметре адресата. Это единственный тип сообщения, в котором используется четвертый параметр extra_headers.
  3. Добавляется к месту назначения файла. Новая строка автоматически не добавляется в конец строки сообщения.

Редактировать: Есть ли у уценки тег noparse для подчеркивания?

5 голосов
/ 21 августа 2008

Мне действительно нравится log4php для регистрации, хотя она еще не вышла из инкубатора. Я использую log4net практически во всем, и нашел стиль, вполне естественный для меня.

Что касается сбоев системы, вы можете регистрировать ошибку в нескольких местах назначения (например, иметь добавочные устройства, чей порог КРИТИЧЕСКИЙ или ОШИБКА, которые вступают в игру только тогда, когда что-то идет не так). Я не уверен, насколько надежны существующие аппендеры - если база данных не работает, как этот аппендер выходит из строя? - но вы могли бы довольно легко написать свой собственный аппендер, который будет грациозно выходить из строя, если не сможет войти. *

3 голосов
/ 21 августа 2008

Просто записать их в файл не будет полезно, не так ли?

Но, конечно, это - это здорово, гораздо лучше, чем отображать их на экране. Вы хотите показать пользователю хороший экран с надписью «Извините, мы обманывают. Инженеры были уведомлены. Вернитесь и попробуйте снова» и АБСОЛЮТНО НЕТ ТЕХНИЧЕСКОЙ ДЕТАЛИ, поскольку это будет представлять угрозу безопасности. Вы можете отправить электронное письмо в общий почтовый ящик и записать исключение в файл или базу данных для последующего просмотра. Это было бы наилучшей практикой.

1 голос
/ 15 сентября 2008

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

Если вы знаете, что это однократная ошибка, отправка уведомления может быть полезной. Тем не менее, при большом количестве посещений в минуту веб-сайт, никогда не отправляйте уведомления по электронной почте. Я видел, как веб-сайт выходил из строя из-за сотен писем в минуту, в которых говорилось, что система не может подключиться к базе данных. Тот факт, что он также имел LoadAvg> 200 из-за того, что почтовый сервер запускался для каждого нового сообщения, совсем не помог. В этом случае - наилучшим сценарием была, безусловно, сторожевая проверка размеров файлов и подключение к внешней службе для отправки SMS (возможно, IM), или наличие внешней системы для просмотра сообщения об ошибке на веб-странице (которое не должен быть виден на экране - это может быть в комментарии HTML).

0 голосов
/ 18 ноября 2009

Вы также можете ловить и записывать исключения PHP с помощью Google Forms. Здесь есть учебник , который объясняет процесс.

0 голосов
/ 16 сентября 2008

Я второй log4php. Обычно я настраиваю его на отправку таких вещей, как исключения, в ERROR или CRITITCAL и их запись в системный журнал. Оттуда вы можете направить ваш системный журнал в Zenoss , Nagios , Splunk или во что-либо еще, с чем syslog может общаться.

0 голосов
/ 21 августа 2008

Я думаю, это зависит от того, где произошла ваша ошибка. Если БД не работает, ее запись в БД не является хорошей идеей;)

Я использую функцию syslog () для регистрации ошибки, но у меня нет проблем с записью ее в файл, когда я нахожусь в системе, которая не поддерживает syslog. Вы можете легко настроить свою систему так, чтобы она отправляла вам электронную почту или jabber-сообщение, используя, например, logwatch или стандартный syslogd .

.
...