Как я могу заставить mediawiki писать мне на электронную почту о каждой ошибке БД? - PullRequest
2 голосов
/ 12 апреля 2011

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

Мне не нужно решение, которое включает в себя демоны, кроны или что-либо еще, что будет считывать и отправлять электронные письма на основе журнала запросов SQL.

1 Ответ

1 голос
/ 17 апреля 2011

Единственный практический способ сделать это, вероятно, зарегистрировать пользовательский обработчик исключений. Там мы проверяем, является ли исключение ошибкой базы данных, и соответственно отправляем электронное письмо.

Я пришел с этим простым кодом:

$wgHooks['SetupAfterCache'][] = 'onSetupAfterCache';
function onSetupAfterCache() {
    set_exception_handler( 'customExceptionHandler' );

    return true;
}

Сначала мы должны установить хук для регистрации нашего обработчика исключений. Если бы мы зарегистрировали это просто в LocalSettings.php, оно было бы переопределено на wfInstallExceptionHandler().

function customExceptionHandler( $e ) {
    if( $e instanceof DBError ) {
        $from = new MailAddress( 'dberror@example.com' );
        $to = new MailAddress( 'personal.mail@example.com' );
        $body = 'A database error occured on My Wiki. Details follow:' . "\n\n" .
            $e->getText();

        UserMailer::send( $to, $from, 'Database error on My Wiki', $body );
    }

Здесь мы проверяем, было ли исключение вызвано базой данных, и отправляем электронное письмо. Вам следует настроить переменные $from, $to и $body. Для получения дополнительной информации о классах UserMailer и MailAddress см. Документацию.

    wfExceptionHandler( $e );
}

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

...