Segnalazione errori PHP


8

Sto cercando di creare un comportamento del tipo: se si verifica un errore irreversibile php, voglio che venga visualizzata la pagina di errore di joomla, ma desidero anche ricevere una mail che mi dice qual è l'errore.

L'idea qui è quella di sbarazzarsi del passaggio per controllare nel registro degli errori di Apache per scoprire l'errore specifico. Voglio anche che il mio visitatore veda la pagina di errore personalizzata che ho impostato.

Ho visto alcune cose che potrebbero aiutarmi, come "ErrorDocument 500 / myerrorpage", tuttavia, non riesco a vedere un modo per rilevare l'errore lì.

C'è un modo per inviare una mail contenente l'errore? L'unica soluzione che posso vedere in questo momento è l'invio di una mail come "Ehi, qualcuno è appena arrivato sulla pagina dell'errore, potresti voler controllare il registro degli errori di Apache per risolverlo".

PS: Se possibile, vorrei non utilizzare un modulo o un plug-in di terze parti, preferisco crearne uno in termini di sicurezza / manutenibilità

Grazie !

Risposte:


5

Ti consigliamo di creare un gestore di errori PHP personalizzato e di inviarti un'email.

È possibile utilizzare FILE e FUNZIONE e LINE costanti al carico di cui l'errore è accaduto nel email che avvisano con te stesso.

Dai un'occhiata a come fare tutto qui: /programming/277224/how-do-i-catch-a-php-fatal-error


4

Ho scoperto che il metodo più semplice / veloce per risolvere questo problema era usare uno script che leggesse i registri di apache e mandasse ogni giorno una mail con un riepilogo.

Cordiali saluti: L'installazione del server ha una rotazione giornaliera del registro, esegue lo script tramite crontab, poco prima del tempo di rotazione. (Inoltre: sono francese, quindi ci sono parole francesi nella posta inviata).

Ecco lo script: (So che potrebbe essere migliorato, ma fa ancora il lavoro necessario)

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

Forse vuoi aggiungere righe per eliminare error.log dopo che il sistema ha inviato l'e-mail?
webchun,

Come ho detto, i registri vengono ruotati ogni giorno e archiviati in .gz in modo da avere ancora accesso ad essi. Il server lo gestisce, lo script è solo a scopo di lettura + reportistica
soenguy

Ah scusa, non l'ho letto. Ad ogni modo, sarebbe possibile avere lo script come plugin installabile? Abbiamo repository JSE pubblici su github per qualsiasi plug-in / modulo installabile che stiamo scrivendo
webchun
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.