Relatório de erro do PHP


8

Estou tentando criar um comportamento como: se houver um erro fatal do php, quero que a página de erro do joomla apareça, mas também quero receber um email informando qual foi o erro.

A idéia aqui é livrar-se da etapa de verificar o log de erros do apache para descobrir o erro específico. Também quero que meu visitante veja a página de erro personalizada que configurei.

Eu já vi algumas coisas que podem me ajudar, como "ErrorDocument 500 / myerrorpage", no entanto, não vejo uma maneira de detectar o erro lá.

Existe uma maneira de enviar um email contendo o erro? A única solução que vejo agora é enviar um e-mail como "Ei, alguém acabou de entrar na página de erro, você pode verificar o log de erros do apache para corrigi-lo".

PS: Se possível, eu gostaria de não usar um módulo ou plugin de terceiros, prefiro fazer o meu em termos de segurança / manutenção

Obrigado !

Respostas:


5

Você deseja criar um manipulador de erros PHP personalizado e enviar um e-mail a você.

Você pode usar ARQUIVO e FUNÇÃO e LINHA constantes a carga onde o erro aconteceu no e-mail que você alertar-se com.

Dê uma olhada em como fazer tudo isso aqui: /programming/277224/how-do-i-catch-a-php-fatal-error


4

Descobri que o método mais fácil / rápido para resolver isso era usar um script para ler os logs do apache e enviar um email todos os dias com um resumo.

FYI: A configuração do servidor tem uma rotação diária do log, execute o script através do crontab, imediatamente antes do tempo de rotação. (Além disso: eu sou francês, então há palavras em francês no e-mail sendo enviado).

Aqui está o script: (Eu sei que poderia ser melhorado, mas ainda faz o trabalho necessário)

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

Talvez você queira adicionar linhas para excluir error.log depois que o sistema enviou o email?
Webchun 21/11/16

Como eu disse, os logs são rotacionados todos os dias e armazenados em .gz, para que você ainda tenha acesso a eles. As alças de servidor que, o script é apenas para leitura + relatórios propósito
soenguy

Desculpe, não li isso. De qualquer forma, seria possível ter o script como um plug-in instalável? Temos pública repo JSE no github para qualquer plugins instaláveis / módulos estamos escritos
webchun
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.