Rapport d'erreurs PHP

8

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 me disant quelle était l'erreur.

L'idée ici est de se débarrasser de l'étape pour vérifier le journal des erreurs d'apache pour trouver l'erreur spécifique. Je souhaite également que mon visiteur voit la page d'erreur personnalisée que j'ai configurée.

J'ai vu quelques choses qui pourraient m'aider, comme "ErrorDocument 500 / myerrorpage", mais je ne vois pas de moyen de détecter l'erreur ici.

Existe-t-il un moyen d'envoyer un courrier contenant l'erreur? La seule solution que je peux voir en ce moment est d'envoyer un mail comme "Hé, quelqu'un vient d'atterrir sur la page d'erreur, vous voudrez peut-être consulter le journal des erreurs d'Apache pour le corriger".

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

Merci !

soenguy
la source

Réponses:

5

Vous voudrez créer un gestionnaire d'erreurs PHP personnalisé et le faire vous envoyer un e-mail.

Vous pouvez utiliser les constantes FILE et FUNCTION et LINE pour charger où l'erreur s'est produite dans l'e-mail avec lequel vous vous alerter.

Découvrez comment faire tout cela ici: /programming/277224/how-do-i-catch-a-php-fatal-error

Lance
la source
4

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

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

Voici le script: (je sais qu'il pourrait être amélioré, mais il fait toujours 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";
soenguy
la source
Vous souhaitez peut-être ajouter des lignes pour supprimer error.log après que le système a envoyé l'e-mail?
webchun
Comme je l'ai dit, les journaux tournent tous les jours et sont stockés dans .gz afin que vous puissiez toujours y accéder. Le serveur gère cela, le script est uniquement destiné à la lecture + à des fins de rapport
soenguy
Ah désolé, je n'ai pas lu ça. Quoi qu'il en soit, serait-il possible d'avoir le script comme plugin installable? Nous avons un dépôt public JSE sur github pour tous les plugins / modules installables que nous avons écrits
webchun