MicroPHP 实战中级篇

错误信息控制

在本节内容开始之前,先看一下下面两个场景。

场景一:

    平时我们都是在开发程序的时候设置error_reporting(E_ALL),当发生notice,warning等错误时,错误信息会直接显示在页面上我们可以通过信息方便的找到错误进行调试程序上线后为了安全,就error_reporting(0)屏蔽错误,但是这样做就有个问题:我们不可能保证程序逻辑完美处理了所有的情况,上线后或多或少的都不能避免程序出问题,这个时候错误信息又被我们屏蔽了,发生问题后要定位错,我们往往要去修改线上的代码,针对ip或者用户,显示错误信息,这个过程是低效率和痛苦的。

场景二:

    现在移动web开发很火,PHP作为手机端后台接口提供数据服务很常见,当php后台接口出现错误信息,往往会导致手机app无法获取正常数据,给手机开发人员带来困惑。同时php后端人员也无法得知当时的错误信息,因为出错那一刻,如果没有关闭错误显示,错误信息返回给手机app了,不可重现。这样给定位错误带来很大的不便,一方面影响开发进度,另一方面给开发带来太多不可控因素。

上面的两个场景暴露了两个不可忽视的问题:

1.在安全性和错误是否显示到页面,这两个方面没有一个好的平衡办法。

2.在错误发生时不能及时的记录,无法为后续定位错误提供有效信息。

本节所说的错误控制就是针对上面暴露出来的两个典型问题,提供一个优雅、安全、自由方便的错误控制。

      MicroPHP框架提供了自由的错误控制,可以在关闭了错误显示的情况下,定制自己的错误处理方法,当出现任何错误的时候,出错信息都会传递给错误处理方法。

     本节展示了通过注册自己错误处理方法,当出现错误的时候就把错误记录到一个日志文件中。这样一来上面的两个问题就迎刃而解,即保证了安全,又保证了错误信息的及时保存。在安全和排错方面都得到了很好的控制。

点击下载演示程序代码

步骤:

入口文件为error.php

1.在入口文件中,控制是否显示错误的是配置项$system['debug']我们设置为false,也就是不显示错误。

2.在入口文件,控制是否记录错误的配置是$system['log_error'],我们设置为true,也就是开启记录错误。

3.在入口文件中修改配置项$system['log_error_handle']下面的内容,即注册我们自己的错误处理方法。

$system['log_error_handle'] = array(
    'error' => array('ErrorHandle' => 'error_handle'),
    'exception' => array('ErrorHandle' => 'exception_handle'), 
    'db_error' => array('ErrorHandle' => 'db_error_handle'),
);
这里我们使用了自己定义的一个错误处理类,ErrorHandle,这个类在library文件夹中ErrorHandle.class.php。

这个类的作用就是把错误信息记录到文件。更多详细信息可以查看该类文件。


    然后我们访问 http://127.0.0.1/demo/error.php?error.fatal ,在方法doFatal里面我们调用了一个不存在的函数ee()

这将导致一个致命错误,然后我们发现页面并没有显出错误信息,然后我们点击查看错误,会发现错误信息已经被记录到错误日志文件中。

    接着我们访问 http://127.0.0.1/demo/error.php?error.error ,在方法doError里面我们试图输出一个不存在的变量的内容,这将导致一个notice错误,然后我们发现页面并没有显出notice错误信息,然后我们点击查看错误,会发现错误信息已经被记录到错误日志文件中。而且我们会发现有个echo @$ddddss; 这个错误用@屏蔽了,那么就不会被记录,控制灵活。