Pelaporan kesalahan PHP

8

Saya mencoba membuat perilaku seperti: jika ada kesalahan fatal php, saya ingin halaman kesalahan joomla muncul, tetapi saya juga ingin menerima email yang memberitahu saya apa kesalahannya.

Idenya di sini adalah untuk menghilangkan langkah untuk memeriksa log kesalahan apache untuk mengetahui kesalahan spesifik. Saya juga ingin pengunjung saya melihat halaman kesalahan khusus yang saya atur.

Saya telah melihat beberapa hal yang mungkin membantu saya, seperti "ErrorDocument 500 / myerrorpage" namun, saya tidak bisa melihat cara untuk menangkap kesalahan di sana.

Apakah ada cara untuk mengirim email yang mengandung kesalahan? Satu-satunya solusi yang dapat saya lihat sekarang adalah mengirim email seperti "Hei, seseorang baru saja mendarat di halaman kesalahan, Anda mungkin ingin memeriksa log kesalahan apache untuk memperbaikinya".

NB: Jika mungkin saya ingin tidak menggunakan modul atau plugin pihak ketiga, saya lebih suka membuatnya dalam hal keamanan / pemeliharaan

Terima kasih!

soenguy
sumber

Jawaban:

5

Anda akan ingin membuat penangan kesalahan PHP khusus dan yang mengirimi Anda email.

Anda dapat menggunakan FILE dan FUNGSI dan LINE konstanta untuk memuat di mana kesalahan terjadi pada email yang Anda beri tahu diri sendiri.

Lihatlah bagaimana melakukan semua itu di sini: /programming/277224/how-do-i-catch-a-php-fatal-error

Tombak
sumber
4

Saya telah menemukan bahwa metode termudah / tercepat untuk menyelesaikan ini adalah dengan menggunakan skrip membaca log apache dan mengirim email setiap hari dengan ringkasan.

FYI: Pengaturan server memiliki rotasi log harian, jalankan script melalui crontab, tepat sebelum waktu rotasi. (Plus: Saya orang Prancis, jadi ada kata-kata dalam surat yang dikirim).

Ini skripnya: (Saya tahu ini bisa diperbaiki, tetapi masih melakukan pekerjaan yang diperlukan)

<?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
sumber
Mungkin Anda ingin menambahkan baris untuk menghapus error.log setelah sistem mengirim email?
webchun
Seperti yang saya katakan, log diputar setiap hari dan disimpan dalam .gz sehingga Anda masih memiliki akses ke sana. Server menanganinya, skrip ini hanya untuk membaca + tujuan pelaporan
soenguy
Ah maaf, tidak membacanya. Lagi pula, apakah mungkin untuk memiliki skrip sebagai plugin yang dapat diinstal? Kami memiliki repo JSE publik di github untuk setiap plugin / modul yang dapat diinstal yang kami tulis
webchun