在实际项目开发中需要获取框架底层异常的时候(因业务代码较多,不知道是哪里调用底层出问题的时候),需要在框架底层获取抛出异常而定位到业务代码调用的时候问题。
主要通过 debug_backtrace() 函数获取调用 堆栈和执行流程。
//主函数调用
child_func();
//调用函数parent_func
function child_func() {
parent_func();
}
//调用grandparent_func
function parent_func() {
grandparent_func();
}
//打印调用堆栈
function grandparent_func() {
var_dump(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS));
}
打印结果:
array(3) {
[0]=>
array(3) {
["file"]=>
string(37) "/Users/user/Desktop/php-cli/index.php"
["line"]=>
int(13)
["function"]=>
string(16) "grandparent_func"
}
[1]=>
array(3) {
["file"]=>
string(37) "/Users/user/Desktop/php-cli/index.php"
["line"]=>
int(8)
["function"]=>
string(11) "parent_func"
}
[2]=>
array(3) {
["file"]=>
string(37) "/Users/user/Desktop/php-cli/index.php"
["line"]=>
int(4)
["function"]=>
string(10) "child_func"
}
}
该函数返回一个 array 打印栈 从深到浅 。。从底层往调用层走。
实际应用:
在 easyswoole 框架中 做umail 邮件群发统计任务的时候,使用的mysql 的orm 连接池出现 2002 异常的时候,由于业务代码比较复杂,执行事务包含的sql语句比较多。 不知道是那个sql调用出现的问题。 后面通过在框架 orm底层源码中 找到抛出异常的位置。 通过 debug_backtrace 函数找到调用的sql。