php Xdebug的安装与使用详解


Posted in PHP onJune 20, 2013

为什么需要Debugger?
很多PHP程序员调试使用echo、print_r()、var_dump()、printf()等,其实对 于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中,通过输出特定变量的值可以判断程序执行是否正确,甚至效率高低也可以 看出来(当然可能还需要使用一些时间函数)。那么我们为什么还需要一个专门的调试程序来监控我们的程序运行呢? 这个问题的答案不妨留到后面来揭晓。
什么是Xdebug?
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。
如何安装Xdebug?:
1. 打开http://www.xdebug.org/download.php下载相应的版本
Win:Windows binaries版本
  Linux:source
得到一个dll文件(win)或运行安装文件(linux)
2. 安装
Win:将下载的dll文件放到相应的目录中。比如我的就放D:\xampp\php\ext下面;
Linux:执行安装文件
tar -xvzf xdebug-2.1.2.tgz
cd  xdebug-2.1.2
phpize (如果phpize没有这个command,需要安装一次phpize。phpize可以让php支持扩展模块)安装phpize:sudo apt-get install php5-dev
如果安装了继续进行下面命令
./configure
make
make install
会有这个界面

php Xdebug的安装与使用详解

cp modules/xdebug.so /usr/lib/php5/20090626+lfs 将xdebug.so文件移到php5下面
3. 编辑php.ini,加入下面几行:
 [Xdebug]
zend_extension=D:\xampp\php\ext\php_xdebug.dll   (Win)
zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so(Linux)

xdebug.profiler_enable=on
xdebug.trace_output_dir="../Projects/xdebug"
xdebug.profiler_output_dir="../Projects/xdebug"
后面的目录“../Projects/xdebug”为你想要放置Xdebug输出的数据文件的目录,可自由设置。
4. 重启Apache;
5. 写一个test.php,内容为<?php phpinfo(); ?>,如果输出的内容中有看到xdebug,说明安装配置成功。如下图:

php Xdebug的安装与使用详解

现在我们来从最简单的程序调试开始一步步介绍Xdebug
调试:
我们先写一个可以导致执行出错的程序,例如尝试包含一个不存在的文件。
testXdebug.php
<?php
require_once(‘abc.php');
?>
然后通过浏览器访问,我们惊奇地发现,出错信息变成了彩色的了:

php Xdebug的安装与使用详解

不过除了样式改变,和我们平时打印的出错信息内容没什么不同,意义不大。好,我们继续改写程序:testXdebug2.php
<?php
testXdebug();
function testXdebug() {
       require_once('abc.php');
}
?>
输出信息:

php Xdebug的安装与使用详解

发现了什么? Xdebug跟踪代码的执行,找到了出错的函数testXdebug()
我们把代码再写得复杂一些: 
testXdebug3.php

<?php
testXdebug();
function testXdebug() {
       requireFile();    
}
function requireFile() {
       require_once('abc.php');
}
?>

输出信息:

php Xdebug的安装与使用详解

也就是说Xdebug具有类似于JavaException的“跟踪回溯”的功能,可以根据程序的执行一步步跟踪到出错的具体位置,哪怕程序中的调用很复杂,我们也可以通过这个功能来理清代码关系,迅速定位,快速排错。

其实PHP函数debug_backtrace()也有类似的功能,但是要注意debug_backtrace()函数只在PHP4.3.0之后版本及PHP5中才生效。这个函数是PHP开发团队在PHP5中新增的函数,然后又反向移植到PHP4.3中。

如何利用Xdebug测试脚本执行时间
测试某段脚本的执行时间,通常我们都需要用到microtime()函数来确定当前时间。例如PHP手册上的例子:

<?php
/**
* Simple function to replicate PHP 5 behaviour
*/
function microtime_float()
{
      list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
// Sleep for a while
usleep(100);
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "Did nothing in $time seconds\n";
?>

但是microtime()返回的值是微秒数及绝对时间戳(例如“0.03520000 1153122275”),没有可读性。所以如上程序,我们需要另外写一个函数microtime_float(),来将两者相加。
Xdebug自带了一个函数xdebug_time_index()来显示时间。
如何测定脚本占用的内存?

有时候我们想知道程序执行到某个特定阶段时到底占用了多大内存,为此PHP提供了函数memory_get_usage()。这个函数只有当PHP编译时使用了-enable-memory-limit参数时才有效。 

Xdebug同样提供了一个函数xdebug_memory_usage()来实现这样的功能,另外xdebug还提供了一个xdebug_peak_memory_usage()函数来查看内存占用的峰值。

如何检测代码中的不足?

有时候代码没有明显的编写错误,没有显示任何错误信息(如errorwarningnotice等),但是这不表明代码就是正确无误的。有时候可能某段代码执行时间过长,占用内存过多以致于影响整个系统的效率,我们没有办法直接看出来是哪部份代码出了问题。这时候我们希望把代码的每个阶段的运行情况都监控起来,写到日志文件中去,运行一段时间后再进行分析,找到问题所在。
回忆一下,之前我们编辑php.ini文件
加入
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="I:\Projects\xdebug"
xdebug.profiler_output_dir="I:\Projects\xdebug"

这几行,目的就在于把执行情况的分析文件写入到”../Projects/xdebug”目录中去(你可以替换成任何你想设定的目录)。如果你执行某段程序后,再打开相应的目录,可以发现生成了一堆文件,例如cachegrind.out.1169585776这种格式命名的文件。这些就是Xdebug生成的分析文件。用编辑器打开你可以看到很多程序运行的相关细节信息,

最后:

Xdebug提供了各种自带的函数,并对已有的某些PHP函数进行覆写,可以方便地用于调试排错;Xdebug还可以跟踪程序的运行,通过对日志文件的分析,我们可以迅速找到程序运行的瓶颈所在,提高程序效率,从而提高整个系统的性能。

PHP 相关文章推荐
PHP获取url的函数代码
Aug 02 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
解析PHP的session过期设置
Jun 29 PHP
php使用curl抓取qq空间的访客信息示例
Feb 28 PHP
php常用字符串处理函数实例分析
Nov 22 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
Sep 28 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
Jul 28 PHP
yii2简单使用less代替css示例
Mar 10 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
PHP回调函数概念与用法实例分析
Nov 03 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 PHP
解析phpstorm + xdebug 远程断点调试
Jun 20 #PHP
hadoop中一些常用的命令介绍
Jun 19 #PHP
hadoop常见错误以及处理方法详解
Jun 19 #PHP
php常用Output和ptions/Info函数集介绍
Jun 19 #PHP
解析PHP中的正则表达式以及模式匹配
Jun 19 #PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 #PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 #PHP
You might like
php max_execution_time执行时间问题
2011/07/17 PHP
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
2007/04/12 Javascript
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
jQuery的css() 方法使用指南
2015/05/03 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
vue项目实战总结篇
2018/02/11 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
[01:07]2015国际邀请赛 中国区预选赛精彩回顾
2015/06/15 DOTA
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
[00:14]护身甲盾
2019/03/06 DOTA
详解在Python程序中自定义异常的方法
2015/10/16 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Python操作Excel之xlsx文件
2017/03/24 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
怎么写有吸引力的自荐信
2013/11/17 职场文书
探亲邀请信范文
2014/01/30 职场文书
学校后勤岗位职责
2014/02/19 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
2015年护士节活动总结
2015/02/10 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
2016大学生党校学习心得体会
2016/01/06 职场文书
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android