PHP错误报告


8

我正在尝试创建以下行为:如果出现php致命错误,我希望显示joomla错误页面,但我也想收到一封邮件,告诉我错误是什么。

这里的想法是摆脱检查apache的错误日志以找出特定错误的步骤。我也希望我的访客看到我设置的自定义错误页面。

我已经看到了一些可能对我有帮助的东西,例如“ ErrorDocument 500 / myerrorpage”,但是我找不到在那里捕捉错误的方法。

有没有一种方法可以发送包含错误的邮件?我现在唯一能看到的解决方案是发送一封邮件,例如“嘿,有人刚登陆错误页面,您可能想查看apache的错误日志进行修复”。

PS:如果可能的话,我不想使用第三方模块或插件,因此我更愿意在安全性/可维护性方面做出自己的选择

谢谢 !

Answers:



4

我发现解决此问题的最简单/快捷的方法是使用脚本读取apache的日志并每天发送带有摘要的邮件。

仅供参考:服务器的设置每天都有日志轮换,请在轮换时间之前通过crontab运行脚本。(加号:我是法语,所以发送的邮件中有法语单词)。

这是脚本:(我知道可以进行改进,但是仍然可以完成所需的工作)

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

也许您想在系统发送电子邮件后添加行以删除error.log?
webchun

正如我所说,日志每天都会轮换并存储在.gz中,以便您仍然可以访问它们。服务器会处理该脚本,该脚本仅用于阅读和报告目的
soenguy

抱歉,没有读过。无论如何,是否可以将脚本作为可安装的插件?我们在github上有公开的JSE存储库,可用于编写任何可安装的插件/模块
webchun
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.