Informe de errores de PHP

8

Estoy tratando de crear un comportamiento como: si hay un error grave de php, quiero que aparezca la página de error de joomla, pero también quiero recibir un correo informándome cuál fue el error.

La idea aquí es deshacerse del paso para verificar el registro de errores de apache para descubrir el error específico. También quiero que mi visitante vea la página de error personalizada que configuré.

He visto algunas cosas que podrían ayudarme, como "ErrorDocument 500 / myerrorpage", sin embargo, no veo una manera de detectar el error allí.

¿Hay alguna forma de enviar un correo que contenga el error? La única solución que puedo ver en este momento es enviar un correo electrónico como "Hola, alguien acaba de llegar a la página de error, es posible que desee consultar el registro de errores de apache para solucionarlo".

PD: si es posible, me gustaría no usar un módulo o complemento de terceros, prefiero hacer el mío en términos de seguridad / mantenibilidad

Gracias !

soenguy
fuente

Respuestas:

5

Querrá crear un controlador de errores PHP personalizado y que le envíe un correo electrónico.

Puede usar las constantes ARCHIVO y FUNCIÓN y LÍNEA para cargar donde ocurrió el error en el correo electrónico con el que se alerta.

Eche un vistazo a cómo hacer todo eso aquí: /programming/277224/how-do-i-catch-a-php-fatal-error

lanza
fuente
4

Descubrí que el método más fácil / rápido para resolver esto era usar un script que lea los registros de apache y enviar un correo todos los días con un resumen.

Para su información: la configuración del servidor tiene una rotación diaria de registros, ejecute el script a través de crontab, justo antes del tiempo de rotación. (Además: soy francés, así que hay palabras en francés en el correo que se envía).

Aquí está el script: (Sé que podría mejorarse, pero aún hace el trabajo necesario)

<?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
fuente
¿Quizás desee agregar líneas para eliminar error.log después de que el sistema haya enviado el correo electrónico?
webchun
Como dije, los registros se rotan todos los días y se almacenan en .gz para que aún tenga acceso a ellos. El servidor maneja eso, la secuencia de comandos es solo para fines de lectura + informes
soenguy
Ah lo siento, no leí eso. De todos modos, ¿sería posible tener el script como un complemento instalable? Tenemos un repositorio público de JSE en github para cualquier plugin / módulo instalable que estemos escritos
webchun