Отчеты об ошибках PHP

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

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

Я видел несколько вещей, которые могли бы мне помочь, например «ErrorDocument 500 /myerrorpage», однако я не вижу способа поймать там ошибку.

Есть ли способ отправить сообщение с ошибкой? Единственное решение, которое я вижу сейчас, - это отправить почту вроде «Эй, кто-то просто приземлился на странице с ошибкой, вы можете проверить журнал ошибок Apache, чтобы исправить его».

PS: Если возможно, я бы не хотел использовать сторонний модуль или плагин, я предпочитаю сделать мой с точки зрения безопасности /ремонтопригодности

Спасибо!

9 голосов | спросил soenguy 15 22016vEurope/Moscow11bEurope/MoscowTue, 15 Nov 2016 13:16:15 +0300 2016, 13:16:15

2 ответа


6

Вам нужно создать собственный обработчик ошибок PHP и отправить его по электронной почте.

Вы можете использовать константы FILE и FUNCTION и LINE для загрузки, где произошла ошибка в сообщении электронной почты, с которым вы предупреждаете себя.

Посмотрите, как сделать все это здесь: https : //stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-error

ответил Lance 15 22016vEurope/Moscow11bEurope/MoscowTue, 15 Nov 2016 23:53:46 +0300 2016, 23:53:46
5

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

FYI: установка сервера имеет ежедневное вращение журнала, запуск скрипта через crontab, как раз перед временем вращения. (Плюс: я французский, поэтому в почте отправляются французские слова).

Вот сценарий: (Я знаю, что он может быть улучшен, но он все еще выполняет необходимую работу)

<?php

$start = microtime(true);
$filepath = "PATH/TO/APACHE/LOGS";
$filename = "error.log";
$to = "[email protected]";

$file = file($filepath . $filename);

$warnings = [];
$errors = [];
$notices = [];

foreach($file as $line) {
    $error = strpos($line, "PHP Fatal error");
    if ($error !== false) {
        $exp = explode("PHP Fatal error", $line);
        $exp2 = explode(", referer", $exp[1]);
        $final = "PHP Fatal error" . $exp2[0];
        isset($errors[$final]) ? $errors[$final]+= 1 : $errors[$final]= 1;
    } else {
        $warning = strpos($line, "PHP Warning");
        if ($warning !== false) {
            $exp = explode("PHP Warning", $line);
            $exp2 = explode(", referer", $exp[1]);
            $final = "PHP Warning" . $exp2[0];
            isset($warnings[$final]) ? $warnings[$final]+= 1 : $warnings[$final]= 1;
        } else {
            $notice = strpos($line, "PHP Notice");
            if ($notice !== false) {
                $exp = explode("PHP Notice", $line);
                $exp2 = explode(", referer", $exp[1]);
                $final = "PHP Notice" . $exp2[0];
                isset($notices[$final]) ? $notices[$final]+= 1 : $notices[$final]= 1;
            }
        }
    }
}

$errorNb = countArray($errors);
$warningNb = countArray($warnings);
$noticeNb = countArray($notices);

function countArray($ar) {
    $nb = 0; foreach($ar as $a){ $nb+=$a; } return $nb;
}

$subject = "Rapport apache : Erreurs : " . $errorNb . " - Warnings : " . $warningNb . " - Notices :" .$noticeNb;
$message = "<br>Liste des erreurs (PHP Fatal error) rencontrées :"."<br>";
foreach($errors as $i => $e) {
    $message .= "Rencontré " . $e . " fois : " . $i . "<br>";
}
$message .= "<br>"."<br>Liste des warning (PHP Warning) rencontrées :"."<br>";
foreach($warnings as $i => $e) {
    $message .= "Rencontré " . $e . " fois : " . $i . "<br>";
}
$message .= "<br>"."<br>Liste des erreurs (PHP Notice) rencontrées :"."<br>";
foreach($notices as $i => $e) {
    $message .= "Rencontré " . $e . " fois : " . $i . "<br>";
}

//echo $subject . "<br>" . "<br>";

$message.= "<br><br><br><br>Rapport généré en " . (microtime(true) - $start) . " secondes";

//echo $message;

$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
ответил soenguy 21 12016vEurope/Moscow11bEurope/MoscowMon, 21 Nov 2016 14:09:29 +0300 2016, 14:09:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132