Регистрация фатальных / разбора ошибок в PHP5 - PullRequest
5 голосов
/ 05 мая 2010

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

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

Я почти уверен, что это можно сделать с помощью модуля PHP, но я никогда не писал его и понятия не имею, с чего начать.

Ответы [ 2 ]

3 голосов
/ 07 июня 2010

Нет способа поймать фатальную ошибку или ошибку разбора в PHP. Но ..

В 5.2 они добавили error_get_last () . Вы можете вызвать его внутри функции отключения и выполнить регистрацию. Непроверенный пример 5.3 для отправки почты при фатальной ошибке:

<?php
register_shutdown_function(function(){
    $err = error_get_last();
    if(is_array($err) && array_key_exists('type', $err) $err['type'] > 0 
      && ($err['type'] == E_ERROR || $err['type'] == E_PARSE) {
        error_log("Oh noes, a fatal: " . var_export($err, true), 1, 'fatals@example.com');
    }
});

(Вам понадобится обратный вызов, если вы не используете 5.3 и не можете выполнять анонимные функции.)

К сожалению, поскольку это обрабатывается в функции отключения, есть вероятность, что заголовки уже были отправлены, и вы не сможете предоставить что-либо полезное для пользователя. Это зависит от остальной части приложения, поэтому оно может сработать для вас. Попробуйте и узнайте!

1 голос
/ 08 июня 2010

По умолчанию все ошибки передаются в журнал ошибок веб-сервера, но вы можете изменить его в php.ini, указав путь к собственному файлу с помощью параметра error_log . Поэтому осталось написать отдельный скрипт / приложение для анализа / отправки данных / усечения файла журнала каждый день / что угодно и запускать его как задание cron.

...