web-dev-qa-db-fra.com

PHP rapports d'erreur

J'essaie de créer un comportement tel que: s'il y a une erreur fatale php, je veux que la page d'erreur joomla apparaisse, mais je veux aussi recevoir un mail m'indiquant quelle était l'erreur.

L'idée ici est de supprimer l'étape de vérification du journal des erreurs d'Apache afin de connaître l'erreur spécifique. Je souhaite également que mon visiteur voie la page d'erreur personnalisée que j'ai configurée.

J'ai vu quelques choses qui pourraient m'aider, comme "ErrorDocument 500/myerrorpage", cependant, je ne vois pas comment y remédier.

Est-il possible d'envoyer un courrier contenant l'erreur? La seule solution que je vois actuellement consiste à envoyer un courrier du type "Hé, quelqu'un vient juste d’atteindre la page d’erreur, vous voudrez peut-être consulter le journal des erreurs d’Apache pour y remédier".

PS: Si possible, j'aimerais ne pas utiliser de module ou plugin tiers, je préfère en faire un en termes de sécurité/maintenabilité

Merci !

8
soenguy

Vous voudrez créer un gestionnaire d’erreurs personnalisé PHP) et l’envoyer par courrier électronique.

Vous pouvez utiliser [~ # ~] le fichier [~ # ~] et [~ # ~] la fonction [~ # ~] et [~ # ~] ligne [~ # ~] constantes à charger dans lesquelles l'erreur s'est produite l'e-mail avec lequel vous vous alignez.

Regardez comment faire tout cela ici: https://stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-error

5
Lance

J'ai découvert que la méthode la plus simple et la plus rapide pour résoudre ce problème consistait à utiliser un script lisant les journaux d'Apache et à envoyer un courrier tous les jours avec un résumé.

FYI: La configuration du serveur a une rotation journalière des journaux, exécutez le script via crontab, juste avant l'heure de rotation. (Plus: je suis français, il y a donc des mots français dans le courrier envoyé).

Voici le script: (Je sais que cela pourrait être amélioré, mais cela reste le travail nécessaire)

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