PHPエラー報告


8

次のような動作を作成しようとしています。phpの致命的なエラーが発生した場合、joomlaのエラーページを表示したいのですが、エラーが何であるかを通知するメールも受け取りたいです。

ここでの考え方は、特定のエラーを見つけるためにapacheのエラーログをチェックするステップを取り除くことです。また、設定したカスタムエラーページを訪問者にも表示してもらいたいです。

「ErrorDocument 500 / myerrorpage」のように、私に役立つ可能性のあるものをいくつか見ましたが、そこでエラーをキャッチする方法がわかりません。

エラーを含むメールを送信する方法はありますか?私が今見ることができる唯一の解決策は、「ちょっと、誰かがエラーページにたどり着いたので、それを修正するためにApacheのエラーログをチェックしたいかもしれません」のようなメールを送ることです。

PS:可能であれば、サードパーティのモジュールやプラグインを使用したくないので、セキュリティ/保守性の観点から自分で作成することをお勧めします

よろしくお願いします!

回答:



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 '21
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.