什么叫在线调试?就是在线上生产环境进行调试,假设有一天某个用户报某个页面某个数据怎么不对啊,看来线上出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文件的路径 ”

很好用的php在线调试工具的更多相关文章

  1. Method Draw – 很好用的 SVG 在线编辑器

    Method Draw 是一款在线 SVG 编辑器,是 SVG Edit 的一个分支.Method Draw 的目的是改进 SVG Edit 的可用性和用户体验.它移除了 line-caps/corn ...

  2. 分享十个JavaScript在线调试工具

    测试Javascript可能是网页开发中最让人忧伤的工作.这里我找一些比较好的工具来帮助大家进行测试工作.这10款是我精选的基于浏览器的JavaScript在线调试工具,希望你们对你们有用. 1.Op ...

  3. web html 在线调试工具

    html 的主要在线调试工具有以下几个: 1. plnkr.co 速度快,支持任意的外部css 和 js.  推荐. http://plnkr.co/edit/?p=preview 2. jsbin. ...

  4. 利用JVM在线调试工具排查线上问题

    在生产上我们经常会碰到一些不好排查的问题,例如线程安全问题,用最简单的threaddump或者heapdump不好查到问题原因.为了排查这些问题,有时我们会临时加一些日志,比如在一些关键的函数里打印出 ...

  5. 015_python原生在线调试工具

    一.pdb https://docs.python.org/3/library/pdb.html

  6. 8个很实用的在线工具来提高你的Web设计和开发能力

    近期在网上看到一张帖子感觉不错.只是是英文版的今天闲着没事锻炼一下英语能力分享给大家看看! 原文地址:http://webdesignledger.com/tools/8-useful-online- ...

  7. golang调试工具Delve

    Devle是一个非常棒的golang 调试工具,支持多种调试方式,直接运行调试,或者attach到一个正在运行中的golang程序,进行调试. 线上golang服务出现问题时,Devle是必不少的在线 ...

  8. Linux调试工具

    1. 使用printf调试 #ifdef DEBUG Printf(“valriable x has value = %d\n”, x) #endif 然后在编译选项中加入-DDEBUG 更复杂的调试 ...

  9. Java开发常用的在线工具

    原文出处: hollischuang(@Hollis_Chuang) 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中 ...

随机推荐

  1. Spring JDBC处理BLOB类型字段

    以下示例将演示使用spring jdbc更新BLOB类型的字段值,即更新student表中的可用记录. student表的结构如下 - CREATE TABLE student( ID INT NOT ...

  2. Python操作SQLServer示例(转)

    转自:http://www.cnblogs.com/lrzy/p/4346781.html 本文主要是Python操作SQLServer示例,包括执行查询及更新操作(写入中文). 需要注意的是:读取数 ...

  3. [深入理解Android卷一全文-第三章]深入理解init

    因为<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. ...

  4. linux中service的问题

    1.描述问题 2.解决方案 systemctl stop firewalld systemctl mask firewalld Then, install the iptables-services ...

  5. 机器学习——利用PCA来简化数据

    降维技术的好处: 1.使得数据集更易使用 2.降低很多算法的计算开销 3.取出噪声 4.使得结果易懂 在已标注和未标注的数据上都有降维技术,降维的方法: 1.主成分分析(Principal Compo ...

  6. 5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践

    5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践 进入编辑模式 小写i在当前字符前插入 大写I 在光标所在行的行首插入 大写O 在光标上面一行插入编辑 小写o在光标下面一行插入编辑 小 ...

  7. [转]oracle awr报告生成和分析

    转自:http://blog.csdn.net/cuker919/article/details/8767328 最近由于数据库cpu占用非常高,导致VCS常常自动切换,引起很多问题. 最近学习一下数 ...

  8. UML的学习

    1.什么是UML? 统一建模语言(UML,英语:Unified Modeling Language)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的. ...

  9. Node.js 模块之 morgan中间件记录日志

    NodeJs中Express框架使用morgan中间件记录日志 Express中的app.js文件已经默认引入了该中间件var logger = require('morgan'); 使用app.us ...

  10. 站长常用的200个js代码 站长常用js代码大全 站长常用js代码集合

    站长常用的200个js代码 1.文本框焦点问题 onBlur:当失去输入焦点后产生该事件 onFocus:当输入获得焦点后,产生该文件 Onchange:当文字值改变时,产生该事件 Onselect: ...