手动捕获错误,并发送到聊天机器人

开发中,一般我们的错误是写入文件中,这种方式有一个不太友好的点,就是无法及时通知到开发者,并且事后再去筛选报错点,也不是很方便。

我平时是把这些错误自己抓取到,然后通过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 协议》,转载必须注明作者和本文链接
六月的风
Junwind
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!