php 调试技巧,代码调试技巧:PHP 代码调用栈

背景:我们经常会阅读别人的代码。特别是维护旧项目。有些项目代码写得杂乱,还稍带着用了一些冷门特性。或者,项目本身很复杂,又急于想快速搞定代码执行流程的时候。我们此时就非常想知道 PHP 代码的调用栈。博主曾经多次帮人快速定位错误,排查指定位置的代码为何会调用一些功能。

基于以上原因,今天我们就来讲一讲在 PHP 项目当中,怎样快速得到 PHP 调用栈。

PHP 调用栈,顾名思义就是从我们 Web 访问项目的时候,PHP 从执行开始到返回给我们结果的这一系列操作的 PHP 类/方法等调用的过程。

一、利用 XDebug 扩展的 xdebug_get_function_stack() 函数

对 XDebug 扩展了解的同学,可以知道 XDebug 的功能主要用于代码调试。其中,XDebug 就提供了一个非常有用的函数:xdebug_get_function_stack()。

从这个函数的的名字我们可以知道它就是获取方法调用栈的。

我们只需要在项目当中放到 PHP 脚本当中,只要这个方法被执行到。那么,这个方法就能打印 PHP 脚本从开始到执行到这个位置的所有调用栈。从而就能解决我们对代码执行流程不清晰的问题。

这个方法会返回一个数组。数据里面包含了执行的脚本文件路径、类名、方法名、参数等信息。

注:该方法生成的调用栈信息相对比较粗糙。对于简单初浅调试完成够用了。同时,要使用这个方法,必须安装 XDebug 扩展。PHP 安装 XDebug 扩展的教程网上很多。这里不赘述。

二、利用 phptrace 扩展查看

phptrace 是一个追踪(trace)PHP 执行流程的工具。这是奇虎 360 团队开源的一款 PHP 扩展工具。它本身的功能之一就是查看 PHP 调用栈。所以,推荐指数 5 颗星。

安装扩展:

$ wget https://pecl.php.net/get/trace-1.0.1beta.tgz

$ tar zxvf trace-1.0.1beta.tgz

$ cd trace-1.0.1beta/extension

$ {php_bin_dir}/phpize

$ ./configure --with-php-config={php_bin_dir}/php-config

$ make

$ make cli

$ make install-all

然后在 php.ini 配置文件末尾增加:

extension=trace.so

重启我们的 PHP-FPM。

为了能在命令行使用 phptrace 提供的命令,我们还需要在刚刚的 extension 目录下面执行如下两个命令:

$ make cli

$ make install-cli

在开始我们的表演之前,我们还需要做一件事情:把我们本地的 PHP-FPM 工作进程设置为1。因为,我们是针对 PHP-FPM 的进程进行 PHP 调用栈打印的。所以,我们必须把 PHP-FPM 的 worker 进程设置为1。具体如何设置,网上有很这方面的资料。这里不再赘述。

记得设置之后要重启 PHP-FPM 噢!

获取PHP-FPM worker 进程的 PID

[root@localhost ~]# ps -ef|grep php-fpm

root 14693 1 0 17:50 ? 00:00:00 php-fpm: master process (/usr/local/php72/etc/php-fpm.conf)

www 14694 14693 0 17:50 ? 00:00:00 php-fpm: pool www

root 16455 2163 0 18:06 pts/0 00:00:00 grep --color=auto php-fpm

我的 PHP-FPM 进程 ID 是 14694。

现在,我们来监控 PHP 的调用栈信息。

$ phptrace -p 14694

执行如上命令之后,我们访问我们的 PHP 项目。这时候命令行终端界面就会打印出整个项目的执行流程。

关于 phptrace 的更多资料可以通过网上搜索。博主这里仅仅是一个抛砖引玉。有不对之处,请指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值