为何须要Debugger?php
不少PHP程序员调试使用echo、print_r()、var_dump()、printf()等,其实对 于有较丰富开发经验的程序员来讲这些也已经足够了,他们每每能够在程序执行的过程当中,经过输出特定变量的值能够判断程序执行是否正确,甚至效率高低也能够 看出来(固然可能还须要使用一些时间函数)。那么咱们为何还须要一个专门的调试程序来监控咱们的程序运行呢? 这个问题的答案不妨留到后面来揭晓。linux
什么是Xdebug?程序员
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),能够用来跟踪,调试和分析PHP程序的运行情况。浏览器
如何安装Xdebug?:编辑器
1. 打开http://www.xdebug.org/download.php下载相应的版本函数
Win: Windows binaries版本工具
Linux: source性能
获得一个dll文件(win)或运行安装文件(linux)测试
2. 安装ui
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
会有这个界面
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,说明安装配置成功。以下图:
如今咱们来从最简单的程序调试开始一步步介绍Xdebug。
调试:
咱们先写一个能够致使执行出错的程序,例如尝试包含一个不存在的文件。
testXdebug.php
而后经过浏览器访问,咱们惊奇地发现,出错信息变成了彩色的了:
不过除了样式改变,和咱们平时打印的出错信息内容没什么不一样,意义不大。好,咱们继续改写程序:
testXdebug2.php
输出信息:
发现了什么? Xdebug跟踪代码的执行,找到了出错的函数testXdebug()。
咱们把代码再写得复杂一些:
testXdebug3.php
输出信息:
也就是说Xdebug具备相似于Java的Exception的“跟踪回溯”的功能,能够根据程序的执行一步步跟踪到出错的具体位置,哪怕程序中的调用很复杂,咱们也能够经过这个功能来理清代码关系,迅速定位,快速排错。
其实PHP函数debug_backtrace()也有相似的功能,可是要注意debug_backtrace()函数只在PHP4.3.0以后版本及PHP5中才生效。这个函数是PHP开发团队在PHP5中新增的函数,而后又反向移植到PHP4.3中。
如何利用Xdebug测试脚本执行时间
测试某段脚本的执行时间,一般咱们都须要用到microtime()函数来肯定当前时间。例如PHP手册上的例子:
可是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()函数来查看内存占用的峰值。
如何检测代码中的不足?
有时候代码没有明显的编写错误,没有显示任何错误信息(如error、warning、notice等),可是这不代表代码就是正确无误的。有时候可能某段代码执行时间过长,占用内存过多以至于影响整个系统的效率,咱们没有办法直接看出来是哪部份代码出了问题。这时候咱们但愿把代码的每一个阶段的运行状况都监控起来,写到日志文件中去,运行一段时间后再进行分析,找到问题所在。
回忆一下,以前咱们编辑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还能够跟踪程序的运行,经过对日志文件的分析,咱们能够迅速找到程序运行的瓶颈所在,提升程序效率,从而提升整个系统的性能。