phptrace简介 phptrace 是一个追踪(trace)PHP执行流程的工具,你如果用过strace的话,则可能很容易想到phptrace到底实现了什么样的功能。其实,phptrace是类strace的一个实现,不同的是,strace用来追踪系统调用,而phptrace用来追踪PHP函数调用。无论是开发测试还是线上追查问题,代码执行流程往往会提供许多有用的信息; 对于系统函数,我们可以用strace来观察其调用信息,然而PHP却长久以来缺少这么一个行之有效的工具,因此我们开发了phptrace。 phptrace 目前包括两部分功能: C程序的调用栈,我们通过pstack或gdb可以很容易获取到。PHP作为一种非编译型的语言,实际运行在C编写的PHP虚拟机之上。当我们用pstack 或 gdb来打印PHP的调用栈时,实际是打印的虚拟机的执行信息。 比如: $ pstack 3130 3130 为php-fpm的进程ID,通过pstack我们看到了PHP虚拟机调用栈,然而对于一个PHP开发者来说,更感兴趣的是PHP的调用栈,你可以通过phptrace获取: $ ./phptrace -p 3130 -s -p 参数指定进程pid, -s表示我们需要获取stack信息; -p参数是必需的,并且只能是PHP相关进程(php,php-cli,php-fpm)的pid,这很好理解,因为我们获取的是PHP的调用信息。-s 如果省略,则phptrace不会打印调用栈,而是实时获取PHP函数执行流程,即phptrace的第二个功能,也是其主要功能。现在我们仍然回到stack上来。 程序输出的第一行,是版本信息,第二行显示了其进程PID,第三行是当前执行的PHP脚本,从第四行开始就是调用栈信息,从打印的信息可以看出,最外层run函数调用了say函数,最终调用了sleep函数。这时我们curl访问以下这个php脚本,显然会被堵塞住: curl http://localhost:8804/block.php 我们知道,block.php在sleep,但是我们却不知道其到底要sleep多长时间,如果能获取到sleep的参数,问题便迎刃而解了,这时,就需要用到我们的第二个功能:实施追踪PHP调用。 实时追踪PHP调用(trace) trace功能依赖于我们实现的PHP模块,模块作为后端实时获取PHP调用信息,前端程序phptrace则解析并打印调用信息,因此,在使用这个功能之前需要先安装phptrace扩展。安装扩展后,重启fpm,并打开trace。 $ phptrace -p 3130 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|