很高兴很多朋友还在使用这个项目,帮助他们解决了一些线上问题。如果对线上项目的运行逻辑不熟悉,或者不知道某个方法调用的来源,或者线上有接口不知道从哪里异常退出,以及在线通话特别耗时,更适合使用Deliverer来解决,帮你避免跑路。https://github.com/zhoumengka...前几天有群友在网上遇到一些问题,用Deliverer排查,但还是不能第一时间解决,于是微信联系了我。和我交流了工具的使用方法。虽然最终通过Deliverer的历史日志记录定位了线上的bug,但是我也发现了一个之前Deliverer工具忽略的问题:因为为了尽量减少日志的输出和性能的损失,只监控用户自定义的方法和函数,导致通过系统产生一些神奇的方法,如__get、__call。返回默认设置error_reporting(E_ALL);ini_set('display_errors',true);functionaaa($a){returnbbb($a+100);}functionbbb($b){returnccc($b*100).);}函数ccc($c){echo11111;返回1;}functionddd(){返回2;}classabc{publicfunctiontest(){$this->aaa;}privatefunctiontest2($name){echo$name;$abcd=新的abcd();call_user_func([$abcd,"test"]);}publicfunction__get($name){return$this->test2($name);}}classabcd{publicfunctiontest(){$this->aaa;}私有函数test2($name){$this->test3($name);}privatefunctiontest3($name){echo$name;}publicfunction__get($name){return$this->test2($name);}}aaa(1234);ddd();$abc=newabc();$abc->test();$abcd=newabcd();$abcd->test();call_user_func([$abcd,"测试"]);24307-1630335728072334cli/root/deliver-main/deliver/extension/test.php1630335728072690|0x7ff12cc1e030|(无)|aaa|/root/deliverer-main/deliverer/extension/test.php|561630335728072710|0x7ff12cc1e1a0|0x7ff12cc1e030|bbb|/root/deliverer-main/deliverer/extension/test.php|5576203|5716300x7ff12cc1e220|0x7ff12cc1e1a0|ccc|/root/deliverer-main/deliverer/extension/test.php|91630335728072725|0x7ff12cc1e030|(nil)|ddd|/root/deliverer-main/deliverer/extension/test.php|571630335315280ccx7031|eff|eff(nil)|abc::test|/root/deliverer-main/deliverer/extension/test.php|601630335728072749|0x7ff12cc1e200|0x7fff6976a640|abc::test2|/root/deliverer-main/deliverer/extension/test.php|331630335728072762|0x7ff12cc1e270|0x7ff12cc1e200|abcd::test|/root/deliverer-main/deliverer/extension/test.php|281630335728072764|0x7ff12cc1e390|0x7fff6976a060|abcd/deliverer-main/deliverer-test2|abcd/deliverer-test2php|521630335728072766|0x7ff12cc1e400|0x7ff12cc1e390|abcd::test3|/root/deliverer-main/deliverer/extension/test.php|431630335728072772|0x7ff12cc1e030|(nil)|abcd::test|/root/deliverer-main/deliverer/extension/test.php|621630335728072773|0x7ff12cc1e200|0x7fff6976a640|abcd::test2|/root/deliverer-main/deliverer/extension/test.php|521630335728072774|0x7ff12cc1e270|0x7ff12cc1e200|abcd::test3|/root/deliverer-main/deliverer/extension/test.php|431630335728072777|0x7ff12cc1e030|(nil)|abmainextendenced::test|/root/deliverer-test.php|631630335728072778|0x7ff12cc1e200|0x7fff6976a640|abcd::test2|/root/deliverer-main/deliverer/extension/test.php|521630335728072779|0x7ff12cc1e270|0x7ff12cc1e/de200|abcd::liverextension/test.php|43你可以看到:abcd:test两次通过call_user_func,没问题,是回调方法,有独立的入栈出栈,但是因为__get是系统方法,所以不在log记录中,所以abc::test2和abcd::test2都没有可以找到0x7fff6976a060父节点。原计划是单独监听魔术方法,后来想了想,在单线程模型下,直接用时间戳就可以了,直接挂上一时刻的函数就行了。https://github.com/zhoumengka...
