(5)php框架开发---错误处理

本文探讨了在PHP开发中如何处理错误,强调了直接在页面上显示错误信息的不便,并推荐使用日志记录错误。通过介绍set_error_handler函数,展示了如何将错误信息写入文件。同时指出在PHP5中,set_error_handler无法处理E_ERROR错误,而PHP7则可使用set_exception_handler。为了解决PHP5的这个问题,文中提出了使用register_shutdown_function作为替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    在写开发的时候难免会出现代码写错的尴尬,这里面如果不是在运行环境的话,我们可以直接使用以下的命令来直接显示错误在页面上

ini_set('display_errors',1);            //错误信息
ini_set('display_startup_errors',1);    //php启动错误信息
error_reporting(-1);                    //打印出所有的 错误信息

这样子我们就可以直接看见错误信息了,但是这个情况其实是很少出现的。毕竟这样子做是一种不好的方法。毕竟错误都是要写日志的,有日志我们才能清楚程序哪个地方出现bug了。而且程序上线的时候未必能够找到全部bug,这里写日志的方式就非常的好。

    想要使用日志的方式,我们可以使用php的错误处理函数




这里面我直接截取php官网上的set_error_handler的文档。所以根据上面的文档我们可以使用它来实现错误处理。实现代码如下:

// error handler function
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting, so let it fall
        // through to the standard PHP error handler
        return false;
    }
    $str = date('Y-m-d H:i:s',time()).' ';
    switch ($errno) {
        case E_USER_ERROR:
            $str .= "<b>My ERROR</b> [$errno] $errstr<br />\n"
            ."  Fatal error on line $errline in file $errfile"
            .", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"
            ."Aborting...<br />\n";
            file_put_contents(dirname(dirname(__FILE__)).'/error_log.txt',$str,FILE_APPEND | LOCK_EX);
            exit(1);
            break;

        case E_USER_WARNING:
            $str .= "<b>My WARNING</b> [$errno] $errstr<br />\n";
            break;

        case E_USER_NOTICE:
            $str .= "<b>My NOTICE</b> [$errno] $errstr<br />\n";
            break;

        default:
            $str .= "Unknown error type: [$errno] $errstr<br />\n"."  Fatal error on line $errline in file $errfile"
                .", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
            break;
    }
    file_put_contents(dirname(dirname(__FILE__)).'/error_log.txt',$str,FILE_APPEND | LOCK_EX);
    /* Don't execute PHP internal error handler */
    return true;
}

// set to the user defined error handler
$error_handler = set_error_handler("myErrorHandler");

这样子我们就可以使用file_put_contents将错误代码写入文件里面了。但是这里面要注意一个问题,php5版本中set_error_handler不会处理E_ERROR错误,所以这里面如个是出现了Fatal Error 的话,这个函数是无法处理的。php7可以使用set_exception_handler函数来进行处理,但是php5却没有这个函数。这里面我们可以使用register_shutdown_function函数来进行处理。具体实现代码如下:

/*
 * 因为php5无法接受E_ERROR错误,所以需要以下函数
 */
register_shutdown_function("shutdown_handler");
function shutdown_handler() {
    define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR |
        E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_PARSE);
    $error = error_get_last();
    if ($error && ($error["type"] === ($error["type"] & E_FATAL))) {
        $errno = $error["type"];
        $errfile = $error["file"];
        $errline = $error["line"];
        $errstr = $error["message"];
        myErrorHandler($errno, $errstr, $errfile, $errline);
    }
}
这样子我们就可以对Fatal Error错误也进行写入日志了。而且安全性也得到了提高,不会显示错误在浏览器里面。如果你对于错误的处理是非常重视的,一出现错误就要处理的。那么这里面还可以继续编写代码。例如:我的错误信息写入日志后,我要立即知道,那么这里面我们还可以写一个邮件发送的功能在里面,只要出现错误,立即发送错误代码给管理员进行处理。这里面系统如果是很大的话,还可以使用消息队列来进行发送邮件。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值