当前位置: 首页 > 后端技术 > PHP

PHP5下的错误处理及问题定位

时间:2023-03-29 21:02:41 PHP

背景介绍下面说说PHP出现E_ERROR级别的致命运行时错误时的问题定位方法。例如,像Fatalerror:Allowedmemorysizeofmemoryoverflow。当出现这种错误时,程序会直接退出,PHP的错误日志中会记录一个错误日志,说明具体文件和报错的代码行数,其他任何信息都没有了.如果是PHP7,也可以像捕获异常一样捕获错误,但是PHP5就不行了。一般的思考方式就是看报错的具体代码。如果错误报告文件是CommonReturn.class.php,它看起来像下面这样。1,'message'=>'Allowedmemorysizeof1048576bytesexhausted(triedtoallocate525177bytes)','file'=>'/CommonReturn.class.php','line'=>23,)trace:#0CommonReturn::handleFatal()traceback信息无源,尴尬。猜测是因为backtrace信息保存在内存中,当出现致命错误时会被清除。没办法,尽量从外面传入backtrace。再次修改CommonReturn.class.php。1,'message'=>'Allowedmemorysizeof1048576bytesexhausted(triedtoallocate525177bytes)','file'=>'/CommonReturn.class.php','line'=>26,)trace:#0CommonReturn::packData()calledat[/bug.php:13]调用源成功定位到bug.php的第13行。将最终的CommonReturn.class.php发布到生产环境,再次出错时读取日志即可。但是这样的话,所有调用packData的程序都会执行trace函数,肯定会影响性能。总结注意其中用到的register_shutdown_function函数。可以注册多个不同的回调,但是如果一个回调函数退出,后面注册的回调函数将不会执行。debug_print_backtrace,第一个获取backtrace信息的函数,是否包含请求参数,第二个是backtrace记录层数。我们这里不返回请求参数,这样可以节省一些内存,如果请求参数很大,直接调用这个函数可能会导致内存溢出。向上。最好的办法是升级PHP7,可以捕获异常之类的错误。