紀錄 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
);
}
});