手动捕获错误,并发送到聊天机器人
开发中,一般我们的错误是写入文件中,这种方式有一个不太友好的点,就是无法及时通知到开发者,并且事后再去筛选报错点,也不是很方便。
我平时是把这些错误自己抓取到,然后通过webhook发送到企业微信机器人,钉钉机器人等上。这样的话,错误能及时通知到,而且记录一直都在,也方便了查找。
下面是抓取的方法
// 根据需要,可以限制仅在开发环境中触发。
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
$error_names = [
E_ERROR => 'E_ERROR',
E_WARNING => 'E_WARNING',
E_PARSE => 'E_PARSE',
E_NOTICE => 'E_NOTICE',
E_CORE_ERROR => 'E_CORE_ERROR',
E_CORE_WARNING => 'E_CORE_WARNING',
E_COMPILE_ERROR => 'E_COMPILE_ERROR',
E_COMPILE_WARNING => 'E_COMPILE_WARNING',
E_USER_ERROR => 'E_USER_ERROR',
E_USER_WARNING => 'E_USER_WARNING',
E_USER_NOTICE => 'E_USER_NOTICE',
E_STRICT => 'E_STRICT',
E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
E_DEPRECATED => 'E_DEPRECATED',
E_USER_DEPRECATED => 'E_USER_DEPRECATED',
];
$str = "PHP " . $error_names[$errno] . ": " . $errstr . " in " . $errfile . " on line " . $errline;
// 发送到机器人
});
register_shutdown_function(function () {
if ($error = error_get_last()) {
$error_names = [
E_ERROR => 'E_ERROR',
E_WARNING => 'E_WARNING',
E_PARSE => 'E_PARSE',
E_NOTICE => 'E_NOTICE',
E_CORE_ERROR => 'E_CORE_ERROR',
E_CORE_WARNING => 'E_CORE_WARNING',
E_COMPILE_ERROR => 'E_COMPILE_ERROR',
E_COMPILE_WARNING => 'E_COMPILE_WARNING',
E_USER_ERROR => 'E_USER_ERROR',
E_USER_WARNING => 'E_USER_WARNING',
E_USER_NOTICE => 'E_USER_NOTICE',
E_STRICT => 'E_STRICT',
E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
E_DEPRECATED => 'E_DEPRECATED',
E_USER_DEPRECATED => 'E_USER_DEPRECATED',
];
$str = "PHP " . $error_names[$error['type']] . ": " . $error['message'] . " in " . $error['file'] . " on line " . $error['line'];
// 发送到机器人
}
});
如果我们仅需要致命错误的话,还可以这样
// 根据需要,可以限制仅在开发环境中触发。
register_shutdown_function(function () {
$lastError = error_get_last();
if (!empty($lastError) && $lastError['type'] === E_ERROR) {
...
}
});
本作品采用《CC 协议》,转载必须注明作者和本文链接