什么叫在线调试?就是在线上生产环境进行调试,假设有一天某个用户报某个页面某个数据怎么不对啊,看来线上出BUG了,于是你要迅速找出原因,首先看日志,可是悲剧的没有足够的日志让你确定线上BUG的原因,也许你这时想看某个PHP变量的值,可是你敢在线上环境加个 echo? 出问题了,你就要下岗了,如果用线下环境,可是数据环境不同,可能难以复现线上的BUG呢,这个php在线调试工具就是为解决这种问题而生,可以让你方便地查看任意线上PHP变量的值而不用改动代码,就像C的调试工具gdb那样,以下叫它ydb。
ydb采用扩展实现,在url中输入相关调试参数,即可查看相关变量值,参数包括类名,函数名,变量等。ydb不但可以让你查看任意变量值,而且可以查看函数执行耗时情况,也就是不但可以用来排除业务逻辑BUG,也可以用查看性能问题。你也许担心一个扩展放在线上是否会影响性能,它实际上对性能的影响极小,实际相关计算都是调试者本身产生,如果你觉得极小的性能影响也不能容忍,那可以在调试时再加上该扩展,重启下php进程即可。
下面来看看ydb的具体使用
假设有如下代码在index.php中是我们的调试对象
<?php class CB { private $pv = 'abc'; function add($a,$b){ return $a+$b; } } class CA { public function look_value($pa,$pb){ $fa = $pa; $fb = $pb; $fc = $fa+$fb; $arr = array(1,2,3); $objCb = new CB(); $fd = $objCb->add(3,4); $arr = array(4,5,6); return $fd; } function look_cost(){ $this->fun1(); $this->fun2(); $this->fun3(); usleep(300000); } function fun1(){ usleep(100000); return; } function fun2(){ usleep(200000); return; } function fun3(){ usleep(500000); return; } } $objAt = new CA(); $res = $objAt->look_value(1, 2); $res = $objAt->look_cost(); echo "should not be here";
一.查看变量值
假设我们要查看类CA函数look_value中变量arr的值
我们需要在浏览器中输入如下url:
http://php.wenda.so.com/index.php?c=CA&f=look_value&v=arr ,
各参数意义如下
c : 表示类名
f : 表示函数名
v: 表示你想查看的变量名
键入url的结果是
从结果可以看出值是arr第二次的赋值,所以ydb的显示值都是函数执行完毕变量最后的值(什么?你想看中间值,以后会有的)。
另外,如果不输入v参数,则会打印出函数中的所有变量,输入http://php.wenda.so.com/index.php?c=CA&f=look_value的结果如下所示
可以看到函数look_value中的所有变量包括参数及对象的值都打印出来了
上面说的是get请求,如果是post请求,那该怎么办呢?同样是在url中输入参数,该 url打开提交的表单,在提交表单时,即可打印相应变量值,不过加上参数o标识这是一个post表单请求,这样就不会在当前请求中进行变量打印了。打开url: http://php.wenda.so.com/post.html?c=CA&f=look_value&o=1,显示表单:
点提交按钮后,同样打印类函数look_value中的值,与get请求中一样,如下图所示
扩展中即通过读取post请求的refer值来实现变量值打印。
有时你不想把相关值显示在浏览器上而影响页面的正常展示,而想打印在日志文件中,这时你可以在url中添加l=1参数即可将相关变量输出打印在日志文件中,日志文件是log/ydbinfo.log,在php安装根目录中。
二.查看执行耗时
ydb可以查看某个函数中所有执行子函数的从高到低的执行耗时排行以及该函数执行的总耗时,通过一个个函数跟踪下去,就很容易找出系统的瓶颈在哪,到底哪个函数执行花费了最长时间。
查看执行耗时,也要输入 c,f参数,表示要查看哪个类的哪个函数的耗时情况,另外需要加上t=1参数,表示是查看耗时,而不是查看变量值。继续使用之前index.php中的代码,输入url :
http://php.wenda.so.com/index.php?c=CA&f=look_cost&t=1,即可看到如下结果
最上面一行表示look_cost总的耗时,接下来是look_cost中调用的三个函数耗时从大到小的耗时排行,在实际情况中,我们可以进一步将f参数改为耗时最大的那个子函数,一步步跟踪找到系统瓶颈所在。
对于post请求以及打印信息到日志中,查看耗时与查看变量值一样,相应使用o,l参数即可。
该扩展已放在github 上 https://github.com/micweaver/ydb,php5.3以上版本使用Makefile5.3编译,php5.2版本使用Makefile5.2编译,将Makefile中的php源码路径改为自己目录实际路径,编译得到ydb.so文件即可,然后在php.ini文件中加入如下配置,重启php进程就可以使用拉。
zend_extension=”ydb.so文件的路径 ”