PHP-Fehlerberichterstattung


8

Ich versuche, ein Verhalten wie das folgende zu erstellen: Wenn ein schwerwiegender PHP-Fehler vorliegt, soll die Joomla-Fehlerseite angezeigt werden, aber ich möchte auch eine E-Mail erhalten, in der mir mitgeteilt wird, was der Fehler war.

Die Idee hier ist, den Schritt zum Überprüfen des Apache-Fehlerprotokolls loszuwerden, um den spezifischen Fehler herauszufinden. Ich möchte auch, dass mein Besucher die von mir eingerichtete benutzerdefinierte Fehlerseite sieht.

Ich habe einige Dinge gesehen, die mir helfen könnten, wie "ErrorDocument 500 / myerrorpage", aber ich kann dort keinen Weg finden, den Fehler zu erkennen.

Gibt es eine Möglichkeit, eine E-Mail mit dem Fehler zu senden? Die einzige Lösung, die ich derzeit sehen kann, ist das Senden einer E-Mail wie "Hey, jemand ist gerade auf der Fehlerseite gelandet. Vielleicht möchten Sie das Fehlerprotokoll von Apache überprüfen, um das Problem zu beheben."

PS: Wenn möglich, möchte ich kein Modul oder Plugin eines Drittanbieters verwenden. Ich bevorzuge es, mein Modul in Bezug auf Sicherheit / Wartbarkeit zu erstellen

Vielen Dank !

Antworten:


5

Sie möchten einen benutzerdefinierten PHP-Fehlerbehandler erstellen und sich eine E-Mail senden lassen.

Sie können die Konstanten FILE und FUNCTION sowie LINE verwenden, um zu laden, wo der Fehler in der E-Mail aufgetreten ist, mit der Sie sich benachrichtigen.

Sehen Sie sich hier an, wie das alles funktioniert: /programming/277224/how-do-i-catch-a-php-fatal-error


4

Ich habe herausgefunden, dass die einfachste / schnellste Methode, um dies zu beheben, darin bestand, ein Skript zu verwenden, das die Protokolle von Apache liest und jeden Tag eine E-Mail mit einer Zusammenfassung sendet.

Zu Ihrer Information: Das Server-Setup hat eine tägliche Protokollrotation. Führen Sie das Skript kurz vor der Rotationszeit über crontab aus. (Plus: Ich bin Franzose, also enthält die Mail französische Wörter).

Hier ist das Skript: (Ich weiß, dass es verbessert werden könnte, aber es erledigt immer noch die erforderliche Arbeit)

<?php

$start = microtime(true);
$filepath = "PATH/TO/APACHE/LOGS";
$filename = "error.log";
$to = "MAILTO@ME.COM";

$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";

Vielleicht möchten Sie Zeilen hinzufügen, um error.log zu löschen, nachdem das System die E-Mail gesendet hat?
Webchun

Wie gesagt, Protokolle werden jeden Tag gedreht und in .gz gespeichert, sodass Sie weiterhin Zugriff darauf haben. Der Server kümmert sich
darum

Tut mir leid, habe das nicht gelesen. Wäre es überhaupt möglich, das Skript als installierbares Plugin zu haben? Wir haben ein öffentliches JSE-Repo auf Github für alle installierbaren Plugins / Module, die wir geschrieben haben
Webchun
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.