蒼天家 本家
紀錄 PHP 上的錯誤 2019-08-03
透過 set_error_handler 紀錄 Fatel 外的錯誤,
另外可透過 trigger_error 觸發錯誤.

範例:
1. 以週間方式記錄錯誤 log
2. 每日0:00 ~ 0:10 清除上週的 log
3. 排除 NOTICE 與 DEPRECATED 錯誤

$GLOBALS['error_header'] = 0;
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
set_error_handler(function($code, $msg, $file, $line) {

$logPath = sprintf(
'log/error-weekday-%s.log',
date('w')
);

if (preg_match('/00:(0[0-9])/', date('H:i')) === 1)
file_put_contents($logPath, '');

if ($code <= 2048) {

if ($GLOBALS['error_header'] === 0) {
$error = sprintf(
"---- 檔案: %s ----\n",
$_SERVER['SCRIPT_FILENAME']
);
file_put_contents($logPath, $error, FILE_APPEND);
$GLOBALS['error_header'] = 1;
}

$error = sprintf(
"錯誤(%s): %s,層級:%s,檔案:%s,行數:%s\n",
date('m-d H:i:s'),
$msg,
$code,
$file,
$line
);
file_put_contents($logPath, $error, FILE_APPEND);
}
});

FATEL 錯誤則需要透過 register_shutdown_function + error_get_last 兩方法合併使用,
前者用於 PHP 執行完腳本後執行程序,
後者記錄最後的錯誤內容.

register_shutdown_function(function () {

$logPath = sprintf(
'log/error-weekday-%s.log',
date('w')
);
$error = error_get_last();

if (!is_null($error) && $error['type'] === 1) {

file_put_contents(
$logPath,
sprintf(
"錯誤(%s): %s,層級:%s,檔案:%s,行數:%s\n",
date('m-d H:i:s'),
$error['message'],
$error['type'],
$_SERVER['SCRIPT_FILENAME'],
$error['line']
),
FILE_APPEND
);
}
});
關於我

隨手用部落格

紀錄平時學習用到的東西

考慮想重改版

Github 自學倉庫

我的 Github 帳號

PHP開發

公司: 原生PHP

個人: Slim -> Flight