共计 1318 个字符,预计需要花费 4 分钟才能阅读完成。
前几日有位群友接手一段祖传代码,排查很久没有解决,筹备提桶跑路,最终帮其解决,残缺的过程见 https://mengkang.net/1470.html 然而最初代码的定位我有一些基于集体教训,理论调用的链路和我预计的不一样,都是靠猜。没有看到残缺的调用链路,所以我想着须要一个工具来辅助明确查问到整个残缺的调用链。
所以搞了这么个工具,次要是用于一些不相熟的我的项目,而且日常环境不好复现的线上场景。
deliverer
祖传代码跑路援救者 https://github.com/zhoumengka…
如果你的我的项目不是那么蹩脚,日常环境都 ok,那么相熟一个我的项目最好的形式还是 xdebug,这个工具次要是排查线上问题。
相似的工具有 360 的 phptrace 实现原理上略微有点不同
性能点
- 能够依据
函数名
、类名
、办法名
、路由
来过滤输入 - 能够在查问到指定过滤内容 n 次之后退出
- 能够依据 request id 回放细看整个残缺的调用链
- 过滤的内容会高亮显示
- 调用栈比拟深的能够指定 -l 来暗藏深度调用的展现
原理
其实比较简单,分两步,第一步收集日志,第二步剖析日志。
第一步
在 PHP_MINIT
阶段,通过zend_set_user_opcode_handler
来设置对 ZEND_DO_UCALL
、ZEND_DO_FCALL_BY_NAME
、ZEND_DO_FCALL
三类 opcode
的解决剖析。
留神其中会涵盖一些内置函数和办法的调用,咱们能够通过类型进行过滤。
而后在 PHP_RINIT
阶段新建日志文件,写入申请的信息
pid-ts sapi http_method http_url
申请过程中在自定义的 handler 外面打印调用栈信息
最初在 PHP_RSHUTDOWN
敞开日志文件的写入
第二步
对收集好的日志,利用 bin/deliverer
进行剖析和整顿,这块是 php 脚本,就不赘述了。
装置应用
编译
$ phpize
$ ./configure --with-php-config=/usr/local/php/bin/php-config
$ make && sudo make install
配置 php.ini
追加
[deliverer]
extension=deliverer.so
重启 php-fpm
sudo service php-fpm restart
应用剖析工具
能够挪动 ./bin/deliverer
到你感觉适合的目录,如果在当前目录
$ chmod +x deliverer
用一段我本人很久之前的祖传代码(我的博客)来跑下
$ ./bin/deliverer -t
这样会始终监控所有的 php 过程的执行
$ ./bin/deliverer -tAction::initUser -n3 -l5
参数 | 值 | 解释 |
---|---|---|
-t | Action::initUser | 过滤蕴含该调用的申请 |
-n | 3 | 统计三次而后退出 |
-l | 5 | 函数(办法)调用深度显示,最多显示 5 层,超出局部在开端标出 |
$ ./bin/deliverer -v7979-1624369150991941
通过 -v
requestId
来具体查看残缺调用栈
$ ./bin/deliverer -tSqlExecute::getAll -n1 -l3
当要查询方法,函数调用栈过深,不在层级查问范畴之内,则其外层调用显示红色