从 PHP 7.2 升级到 PHP 8 后自定义错误处理程序中断

问题描述

将我的 PHP 版本从 7.2 升级到 8.0.3 后,我的自定义错误处理程序坏了。

错误如下: [date/time] Trying to access array offset on value of type null | err_error_log.PHP | line:36 (warn)

此处发生错误switch ($lasterror['type']){

完整代码如下:

<?PHP
    set_error_handler("errorHandler");
    register_shutdown_function("shutdownHandler");
    function errorHandler($error_level,$error_message,$error_file,$error_line,$error_context=""){
        $error = $error_message." | ".$error_file." | line:".$error_line;
        switch ($error_level) {
            case E_ERROR:
            case E_CORE_ERROR:
            case E_COMPILE_ERROR:
            case E_PARSE:
                mylog($error,"(fatal)");
                break;
            case E_USER_ERROR:
            case E_RECOVERABLE_ERROR:
                mylog($error,"(error)");
                break;
            case E_WARNING:
            case E_CORE_WARNING:
            case E_COMPILE_WARNING:
            case E_USER_WARNING:
                mylog($error,"(warn)");
                break;
            case E_NOTICE:
            case E_USER_NOTICE:
                mylog($error,"(info)");
                break;
            case E_STRICT:
                mylog($error,"(debug)");
                break;
            default:
                mylog($error,"(warn default)");
        }
    }
    function shutdownHandler(){ //will be called when PHP script ends.
        $lasterror = error_get_last();
        switch ($lasterror['type']){
            case E_ERROR:
            case E_CORE_ERROR:
            case E_COMPILE_ERROR:
            case E_USER_ERROR:
            case E_RECOVERABLE_ERROR:
            case E_WARNING:
            case E_CORE_WARNING:
            case E_COMPILE_WARNING:
            case E_USER_WARNING:
            case E_NOTICE:
            case E_USER_NOTICE:
            case E_STRICT:
            case E_PARSE:
                $error = $lasterror['message']." | ".$lasterror['file']." | line:".$lasterror['line'];
                mylog($error,"fatal");
        }
    }
    function mylog($error,$errlvl){
        error_log($error." ".$errlvl."\n"."https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI] ",0);
        $filename="tmp/variables.txt";
        if (file_exists($filename)){
            $bestand=fopen($filename,"r");
            $variables=fread($filename,filesize($filename));
            error_log("Variabels: ".$variables,0);
        }
    }
?>

可能这是愚蠢的事情,但我似乎无法解决它...它与 $lasterror['type'] 为空或其他有关,如果我从这个主题正确理解它:{{3 }}

感谢任何帮助! 提前谢谢!

修改如下:

function shutdownHandler(){ //will be called when PHP script ends.
        $lasterror = error_get_last();

        if ($lasterror!=null){
            switch ($lasterror['type']){ ...

谢谢@El_Vanja

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)