在我们开发过程、已上线的应用中,程序经常会因为异常而崩溃。
比如:数据库执行失败调用了不存在的类调用了不存在的函数/方法….

如果是在开发过程中还好,问题肯定是由我们自己发现,可以清楚地看到异常的信息。
那么如果是已经上线的应用,那么出现问题的时候,客户往往是这么说的

在xxx的时候 网页没有反应,网页失败了。

So? How to review it?

以上举例是我们本次要解决的问题,我们再来查看一个案例。

用过thinkphp等任何一个框架的都知道,当我们的程序报错时,显示的都是框架美美的报错异常页面。

之所以能显示出框架自定义的页面,都是因为使用了异常处理函数来实现的。

异常处理函数

在默认的php中,产生异常的时候是这样子的:



php提供了set_exception_handler函数,让我们可以自定义异常产生时执行、输出的数据。

<?php
function exception_handler($exception) {
    echo "有异常产生了 傻逼 :\n";
    var_dump($exception);
}

set_exception_handler('exception_handler');

throw new Exception('Uncaught Exception');

此时我们可以看到我们自定义的内容输出了。

在thinkphp中,除了异常类携带的简单file、code、message、trace等

还会获取当前服务器的配置、脚本的参数(get/post…)、数据库查询语句等

然后组合成一个有排版、数据充足的页面展示给我们,方便了我们排查问题。

thinkphp 默认的异常处理器

tp中默认的异常处理器是:\think\exception\Handle这个类,同时在配置文件中也预留了我们自定义的配置空间。

在thinkphp中实现异常上报模块

我自定义了一个继承了tp默认异常处理器的新类,并在其中记录了php脚本执行时间tp能获取到的全部数据 然后上报到数据库(或者其他储存地址)

再自定义了查看异常记录的页面

当点击查看记录的时候,在脚本中开启tp的debug模式,然后复现数据

到这里,哪怕线上的脚本挂了,我们也可以通过此模块查看复现报错的地方。

客户说遇到了问题崩溃了,我们查看此模块分析就可以,

甚至可以每天定期查看该模块,检查程序是否有异常产生,提前解决,提高程序的稳健性