php自定义错误器set_error_handler和register_shutdown_function

发布于:2022-10-13 ⋅ 阅读:(409) ⋅ 点赞:(0)

实现目的:生成错误日志并记录txt文件以便于查询遇到bug,以下方法不影响原来php错误机制

                只记录日志,方法中必须返回false,不然影响原来错误输出,也可以自己写输出错误

1、set_error_handler() 函数设置用户自定义的错误处理函数。

该函数用于创建运行期间的用户自己的错误处理方法。

该函数返回旧的错误处理程序,如果失败则返回 NULL

注意函数捕捉不了部分错误函数,比如未定义函数test()

 2、使用register_shutdown_function函数捕获致命错误,函数运行条件如下

1、当页面被用户强制停止时

2、当程序代码运行超时时

3、当PHP代码执行完成时,代码执行存在异常和错误、警告

错误报告级别

常量 描述
2 E_WARNING 运行时非致命的错误。没有停止执行脚本。
8 E_NOTICE 运行时的通知。脚本发现可能是一个错误,但也可能在正常运行脚本时发生。
256 E_USER_ERROR 用户生成的致命错误。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_ERROR。
512 E_USER_WARNING 用户生成的非致命错误。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_WARNING。
1024 E_USER_NOTICE 用户生成的通知。这就如同由程序员使用 PHP 函数 trigger_error() 生成的 E_NOTICE。
4096 E_RECOVERABLE_ERROR 可捕获的致命错误。这就如同一个可以由用户定义的句柄捕获的 E_ERROR(见 set_error_handler())。
8191 E_ALL 所有的错误和警告的级别,除了 E_STRICT(自 PHP 6.0 起,E_STRICT 将作为 E_ALL的一部分)。

<?php
set_error_handler("myErrorHandler");//运行时错误
register_shutdown_function('fatalError');//致命错误
test();
function myErrorHandler($errno, $errstr, $errfile, $errline){

    $err_code="";
    switch ($errno) {
        case E_ERROR:
            $err_code="E_ERROR";
            break;
        case E_PARSE:
            $err_code="E_PARSE";
            break;
        case E_CORE_ERROR:
            $err_code="E_CORE_ERROR";
            break;
        case E_COMPILE_ERROR:
            $err_code="E_COMPILE_ERROR";
            break;
        case E_USER_ERROR:
            $err_code="E_USER_ERROR";
            break;
        default:
            $err_code="NOTIC_ERROR";
            break;
    }
    $data= $_POST;
    $errorStr="";
    $errorStr .= "\nrequest_type:".$_SERVER['REQUEST_METHOD'];
    $errorStr .= "\nrequest_url:".$_SERVER['REQUEST_URI'];
    $errorStr .="\nrequest_data:".(is_array($data)?json_encode($data):$data);
    $errorStr .=$last= "\n{$err_code}:".$errstr .$errfile." 第 $errline 行.";
    w_log($errorStr,'/err/');
    // echo $last;

    return false;
}
function fatalError() {

    $err_code="";
    if ($e = error_get_last()) {
        switch($e['type']){
            case E_ERROR:
                $err_code="E_ERROR";
            case E_PARSE:
                $err_code="E_PARSE";
            case E_CORE_ERROR:
                $err_code="E_CORE_ERROR";
            case E_COMPILE_ERROR:
                $err_code="E_COMPILE_ERROR";
            case E_USER_ERROR:
                $err_code="E_USER_ERROR";
                halt($e,$err_code);
                break;
        }
    }
    return false;
}
function halt($error,$err_code) {
    $e = array();

    if (!is_array($error)) {
        $trace          = debug_backtrace();
        $e['message']   = $error;
        $e['file']      = $trace[0]['file'];
        $e['line']      = $trace[0]['line'];
        debug_print_backtrace();
        $e['trace']     = ob_get_clean();
    } else {
        $e              = $error;
    }
    $data= $_POST;
    $errorStr="";
    $errorStr .= "\nrequest_type:".$_SERVER['REQUEST_METHOD'];
    $errorStr .= "\nrequest_url:".$_SERVER['REQUEST_URI'];
    $errorStr .="\nrequest_data:".(is_array($data)?json_encode($data):$data);
    $errorStr .=$last= "\n{$err_code}:--".$e['message'] .$e['file']." 第 {$e['line']} 行".PHP_EOL.$e['trace'];

    w_log($errorStr,'/err/');

}

function w_log($data,$path = 'debug/')
{
    $dir = __DIR__ . '/' . $path;

    if (!is_dir($dir)) {
        mkdir($dir, 777);
    }

    $log_file = $dir . date('Ymd', time()) . '.txt';
    file_put_contents($log_file, "\r\n", FILE_APPEND);
    file_put_contents($log_file, "/" . date("Y-m-d H:i:s") . "--" . $data, FILE_APPEND);
}

最后运行结果

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到