关于php:PHP-祖传代码拯救者-Deliverer-他来了

49次阅读

共计 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_UCALLZEND_DO_FCALL_BY_NAMEZEND_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

当要查询方法,函数调用栈过深,不在层级查问范畴之内,则其外层调用显示红色

正文完
 0