前几天一群小伙伴接手了一段祖传代码。查了半天也没有解决。定位是根据我个人的经验。实际调用的链接与我预期的不同。这一切都基于猜测。我没有看到完整的调用链,所以我想我需要一个工具来辅助清楚地查询整个完整的调用链。所以我创造了这样一个工具,主要用于一些不熟悉的项目,以及日常环境不易复现的线上场景。deliverer祖传代码转义https://github.com/zhoumengka...如果你的项目还不错,日常环境还可以,那么熟悉一个项目最好的方式就是xdebug,这个工具主要是在线排错问题。一个类似的工具是360的phptrace。实现原理略有不同。功能点可以根据函数名、类名、方法名、路由过滤输出。查询指定过滤内容n次后即可退出。可以根据requestid回放。整个完整调用链过滤后的内容会高亮显示。如果调用栈比较深,可以指定-l隐藏深层调用。显示原理其实比较简单。它分为两个步骤。第一步是收集日志,第二步是分析日志。第一步是在PHP_MINIT阶段,通过zend_set_user_opcode_handler设置对ZEND_DO_UCALL、ZEND_DO_FCALL_BY_NAME、ZEND_DO_FCALL三种opcode的处理分析。注意一些内置函数和方法的调用都被覆盖了,我们可以按类型过滤。然后在PHP_RINIT阶段新建一个日志文件,在请求过程中写入请求信息pid-tssapihttp_methodhttp_url,在自定义handler中打印调用栈信息,最后在PHP_RSHUTDOWN关闭日志文件的写入第二步就是收集日志,使用bin/deliverer进行分析整理。这是一个php脚本,就不细说了。使用编译安装$phpize$./configure--with-php-config=/usr/local/php/bin/php-config$make&&sudomakeinstallconfigurephp.iniappend[deliverer]extension=deliverer.sorestartphp-fpmsudoservicephp-fpmrestart可以使用分析工具将./bin/deliverer移动到你认为合适的目录下。如果你在当前目录$chmod+xdeliverer使用了一段很久以前我自己的祖传代码(我的博客)来运行$./bin/deliverer-t这样会一直监控所有php进程的执行$./bin/deliverer-tAction::initUser-n3-l5参数值解释-tAction::initUser过滤包含本次调用的请求-n3统计退出三次再退出-l5函数(方法)调用深度显示,最多5层显示,超出部分在末尾标注$./bin/deliverer-v7979-1624369150991941通过-vrequestId详细查看完整的调用栈$./bin/deliverer-tSqlExecute::getAll-n1-l3当一个方法待查询,函数调用栈太深,不在分层查询范围内,外层调用会显示红色
