Báo cáo lỗi PHP


8

Tôi đang cố gắng tạo một hành vi như: nếu có lỗi nghiêm trọng của php, tôi muốn trang lỗi j Joomla xuất hiện, nhưng tôi cũng muốn nhận thư cho tôi biết lỗi đó là gì.

Ý tưởng ở đây là loại bỏ bước kiểm tra nhật ký lỗi của apache để tìm ra lỗi cụ thể. Tôi cũng muốn khách truy cập của mình thấy trang lỗi tùy chỉnh mà tôi đã thiết lập.

Tôi đã thấy một vài điều có thể giúp tôi, như "ErrorDocument 500 / myerrorpage", tuy nhiên, tôi không thể thấy một cách để bắt lỗi ở đó.

Có cách nào để gửi thư có chứa lỗi không? Giải pháp duy nhất tôi có thể thấy ngay bây giờ là gửi thư như "Này, ai đó vừa vào trang lỗi, bạn có thể muốn kiểm tra nhật ký lỗi của apache để sửa nó".

Tái bút: Nếu có thể tôi không muốn sử dụng mô-đun hoặc plugin của bên thứ ba, tôi thích tạo một mô-đun của mình về bảo mật / khả năng bảo trì

Cảm ơn !

Câu trả lời:


5

Bạn sẽ muốn tạo một trình xử lý lỗi PHP tùy chỉnh và yêu cầu gửi email cho bạn.

Bạn có thể sử dụng các hằng số FILEFUNCTIONLINE để tải lỗi xảy ra trong email mà bạn tự cảnh báo.

Hãy xem cách thực hiện tất cả những điều đó tại đây: /programming/277224/how-do-i-catch-a-php-firth-error


4

Tôi đã phát hiện ra rằng phương pháp dễ nhất / nhanh hơn để giải quyết vấn đề này là sử dụng tập lệnh đọc nhật ký của apache và gửi thư mỗi ngày với một bản tóm tắt.

FYI: Thiết lập của máy chủ có vòng quay nhật ký hàng ngày, chạy tập lệnh thông qua crontab, ngay trước thời gian xoay vòng. (Plus: Tôi là người Pháp, vì vậy có những từ tiếng Pháp trong thư được gửi).

Đây là kịch bản: (Tôi biết nó có thể được cải thiện, nhưng nó vẫn làm được việc cần thiết)

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

Có lẽ bạn muốn thêm dòng để xóa error.log sau khi hệ thống đã gửi email?
webchun

Như tôi đã nói, nhật ký được xoay vòng mỗi ngày và được lưu trữ trong .gz để bạn vẫn có quyền truy cập vào chúng. Máy chủ xử lý việc đó, tập lệnh chỉ dành cho mục đích đọc + báo cáo
soenguy

À xin lỗi, đã không đọc nó. Dù sao, liệu có thể có tập lệnh như một plugin có thể cài đặt không? Chúng tôi có repo JSE công khai trên github cho bất kỳ plugin / mô-đun có thể cài đặt nào chúng tôi đã viết
webchun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.