PHP供应了debug_backtrace和debug_print_backtrace两个方法,用于回溯跟踪代码,先来看下这两个方法如何利用:

debug_backtrace : /myworks/test/debug_backtrace.php

<?phpclass backtrace{public function a($param){var_dump(debug_backtrace());}public function b($param1,$param2=null){$this->a($param1);}}$object = new backtrace();$object->b('param1','param2');

实行结果:

phptracePHP代码追踪回溯 React

array(2) {[0]=>array(7) {[\"大众file\"大众]=>string(33) \公众/myworks/test/debug_backtrace.php\公众[\"大众line\"大众]=>int(9)[\"大众function\公众]=>string(1) \"大众a\"大众[\公众class\"大众]=>string(9) \公众backtrace\公众[\公众object\公众]=>object(backtrace)#1 (0) {}[\"大众type\"大众]=>string(2) \"大众->\"大众[\"大众args\公众]=>array(1) {[0]=>&string(6) \"大众param1\"大众}}[1]=>array(7) {[\公众file\公众]=>string(33) \"大众/myworks/test/debug_backtrace.php\公众[\"大众line\"大众]=>int(15)[\公众function\公众]=>string(1) \"大众b\"大众[\"大众class\"大众]=>string(9) \"大众backtrace\"大众[\"大众object\公众]=>object(backtrace)#1 (0) {}[\公众type\"大众]=>string(2) \公众->\公众[\"大众args\"大众]=>array(2) {[0]=>&string(6) \"大众param1\公众[1]=>&string(6) \公众param2\"大众}}}

debug_print_backtrace:/myworks/test/debug_print_backtrace.php

<?phpclass backtrace{public function a($param){debug_print_backtrace();}public function b($param1,$param2=null){$this->a($param1);}}$object = new backtrace();$object->b('param1','param2');

实行结果:

#0 backtrace->a(param1) called at [/myworks/test/debug_print_backtrace.php:9]#1 backtrace->b(param1, param2) called at [/myworks/test/debug_print_backtrace.php:15]

从上面两个demo的输出结果来看,这两个方法都自下而上(这里的自下而上是指调用链的最下层向上追踪)回溯跟踪调用情形,debug_backtrace着重按照层级构造返回结果集,debug_print_backtrace则直接打印出回溯跟踪,更多官方的案例阐明,参考 debug_backtrace 和 debug_print_backtrace

问题思考:在链路追踪系统中,我们常常追踪的不是一个方法的调用链情形,而利用上述两个方法,如果想要追踪回溯某个方法的调用链情形,都须要向该方法体内植入debug_backtrace或debug_print_backtrace方法,这在代码中看起来是十分臃肿的,特殊是在繁芜的业务代码中,掩护起来尤其头疼。
有什么办法可以无入侵或者少入侵地实当代码追踪回溯呢?这里供应两种减少代码入侵,并利于代码分割管理的方法:

魔术方法,重载:__call(),实例如下:

<?phpclass backtrace{public function __call($method,$args){$this->debug();return call_user_func_array([$this,$method],$args);}protected function a(){}protected function b(){}private function debug(){var_dump(debug_backtrace());}}$object = new backtrace();$object->b();$object->a();

上述代码就可以同时对方法a和方法b进行追踪回溯,基于这个思想,读者可以制订自己代码追踪回溯方案。

AOP

AOP的全称是Aspect Oriented Programming,即面向切面编程,PHP相对付JAVA而言,AOP的运用较少,JAVA中大家熟知的Spring就实现了AOP。
类似监控系统、全链路调用系统都是AOP的主要利用场景。
关于PHP措辞中利用AOP,可以拜会:http://aop-php.github.io/。
AOP用来封装横切关注点,详细可以不才面的场景中利用: Authentication(权限)、Caching(缓存)、Context passing(内容通报)、Error handling(缺点处理)、Lazy loading(