it-swarm.com.de

PHP Fehlermeldung

Ich versuche, ein Verhalten wie das folgende zu erstellen: Wenn ein schwerwiegender PHP-Fehler auftritt, 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 loszuwerden, in dem das Apache-Fehlerprotokoll überprüft wird, um den spezifischen Fehler herauszufinden. Ich möchte auch, dass mein Besucher die benutzerdefinierte Fehlerseite sieht, die ich eingerichtet habe.

Ich habe ein paar Dinge gesehen, die mir helfen könnten, wie "ErrorDocument 500/myerrorpage", aber ich kann keinen Weg finden, um den Fehler dort abzufangen.

Gibt es eine Möglichkeit, eine E-Mail mit dem Fehler zu senden? Die einzige Lösung, die ich derzeit sehe, 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 im Hinblick auf Sicherheit/Wartbarkeit zu erstellen

Vielen Dank !

8
soenguy

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

Sie können [~ # ~] Datei [~ # ~] und [~ # ~] Funktion [~ # ~] und [~ # ~] Zeile [~ # ~] Konstanten, in die der Fehler geladen werden soll die E-Mail, mit der Sie sich benachrichtigen.

Sehen Sie sich hier an, wie Sie all dies tun können: https://stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-error

5
Lance

Ich habe herausgefunden, dass die einfachste/schnellste Methode zur Lösung dieses Problems darin bestand, ein Skript zum Lesen der Apache-Protokolle zu verwenden und jeden Tag eine E-Mail mit einer Zusammenfassung zu senden.

Hinweis: Das Server-Setup hat eine tägliche Protokollrotation. Führen Sie das Skript kurz vor der Rotationszeit über crontab aus. (Außerdem: Ich bin Franzose, daher enthält die zu sendende Mail französische Wörter.).

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

<?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";
4
soenguy