什么叫在线调试?就是在线上生产环境进行调试,假设有一天某个用户报某个页面某个数据怎么不对啊,看来线上出BUG了,因而你要迅速找出缘由,首先看日志,但是悲剧的没有足够的日志让你肯定线上BUG的缘由,也许你这时想看某个PHP变量的值,但是你敢在线上环境加个 echo? 出问题了,你就要下岗了,若是用线下环境,但是数据环境不一样,可能难以复现线上的BUG呢,这个php在线调试工具就是为解决这种问题而生,可让你方便地查看任意线上PHP变量的值而不用改动代码,就像C的调试工具gdb那样,如下叫它ydb。php
ydb采用扩展实现,在url中输入相关调试参数,便可查看相关变量值,参数包括类名,函数名,变量等。ydb不但可让你查看任意变量值,并且能够查看函数执行耗时状况,也就是不但能够用来排除业务逻辑BUG,也能够用查看性能问题。你也许担忧一个扩展放在线上是否会影响性能,它实际上对性能的影响极小,实际相关计算都是调试者自己产生,若是你以为极小的性能影响也不能容忍,那能够在调试时再加上该扩展,重启下php进程便可。html
下面来看看ydb的具体使用git
假设有以下代码在index.php中是咱们的调试对象github
<?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中的全部变量包括参数及对象的值都打印出来了post
上面说的是get请求,若是是post请求,那该怎么办呢?一样是在url中输入参数,该 url打开提交的表单,在提交表单时,便可打印相应变量值,不过加上参数o标识这是一个post表单请求,这样就不会在当前请求中进行变量打印了。打开url: http://php.wenda.so.com/post.html?c=CA&f=look_value&o=1,显示表单:性能
点提交按钮后,一样打印类函数look_value中的值,与get请求中同样,以下图所示this
扩展中即经过读取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文件的路径 ”