作者:Haohappy     

MSN: haohappy at msn.com

Blog: http://blog.csdn.net/haohappy2004

2006-07-04

其实PHP函数debug_backtrace()也有类似的功能,但是要注意debug_backtrace()函数只在PHP4.3.0之后版本及
PHP5中才生效。这个函数是PHP开发团队在PHP5中新增的函数,然后又反向移植到PHP4.3中。
如何利用Xdebug使调试信息更加美观?
 
Xdebug扩展加载后,Xdebug会对原有的某些PHP函数进行覆写,以便好更好地进行Debug。比如var_dump()函数,我们知道通常我们需要在函数前后加上”<pre>…</pre>”才能够让输出的变量信息比较美观、可读性好。但是加载了Xdebug 后,我们不再需要这样做了,Xdebug不但自动给我们加上了<pre>标签,还给变量加上颜色。
例:
<?php
$arrTest=array(
       "test"=>"abc",
       "test2"=>"abc2"
);
var_dump($arrTest);
?>
输出:
 
看到了吗? 数组元素的值自动显示颜色。
如何利用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()函数来查看内存占用的峰值。
如何检测代码中的不足?
 
有时候代码没有明显的编写错误,没有显示任何错误信息(如error、warning、notice等),但是这不表明代码就是正确无误的。有时候可能某段代码执行时间过长,占用内存过多以致于影响整个系统的效率,我们没有办法直接看出来是哪部份代码出了问题。这时候我们希望把代码的每个阶段的运行情况都监控起来,写到日志文件中去,运行一段时间后再进行分析,找到问题所在。
回忆一下,之前我们编辑php.ini文件
加入
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="I:/Projects/xdebug"
xdebug.profiler_output_dir="I:/Projects/xdebug" 
这几行,目的就在于把执行情况的分析文件写入到”I:/Projects/xdebug”目录中去(你可以替换成任何你想设定的目录)。如果你执行某段程序后,再打开相应的目录,可以发现生成了一堆文件,例如cachegrind.out.1169585776这种格式命名的文件。这些就是Xdebug生成的分析文件。用编辑器打开你可以看到很多程序运行的相关细节信息,不过很显然这样看太累了,我们需要用图形化的软件来查看。
在Windows平台下,可以用WinCacheGrind(wincachegrind.souceforge.net)这个软件来打开这些文件。可以直观漂亮地显示其中内容:
哇,非常漂亮,我们很直观地看到index.php中我们调用了一个函数testXdebug(),testXdebug()中又调用了requireFile()函数。这样我们就可以非常方便地查看整个脚本的程序结构。
另外,我们还可以看到每个函数被调用的次数及执行所花费的时间!这对于测试程序性能非常有用。
好了,这么一个简单的程序不太能显示出Xdebug+WinCacheGrind的强大,我给出一个稍大点的例子(一个基于Zend Framework的CMS的index.php):
从上图可以看到:整个程序的结构,每个函数被调用的次数,执行时间都一目了然。
小结:
Xdebug提供了各种自带的函数,并对已有的某些PHP函数进行覆写,可以方便地用于调试排错;Xdebug还可以跟踪程序的运行,通过对日志文件的分析,我们可以迅速找到程序运行的瓶颈所在,提高程序效率,从而提高整个系统的性能。

使用Xdebug调试和优化PHP程序[3]相关推荐

  1. GPU高级调试与优化

    GPU的历史很短,只有十几年.但它发展迅猛,凭借强大的并行计算能力和高效率的固定硬件单元,在人工智能.虚拟和增强现实(VR/AR).3D游戏.视频编解码等领域大显身手.而且这种趋势还在延续,基于GPU ...

  2. PhpStorm配置Xdebug调试PHP程序

    From: http://blog.csdn.net/ljfrocky/article/details/46531137 这篇文章主要介绍了如何使用PhpStorm + Xdebug调试PHP程序,需 ...

  3. php xdebug remote_host 多个,卓象程序员:PHPStudy PHPStorm XDebug调试

    原标题:卓象程序员:PHPStudy PHPStorm XDebug调试 1.phpStudy配置 phpStudy集成XDebug扩展,所以不用下载XDebug phpStudy -> 其它选 ...

  4. 优化PHP程序的方法(温故知新)

    1. If a method c++an be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化 ...

  5. 调试Release发布版程序的Crash错误

    订阅 调试Release发布版程序的Crash错误 http://dingchaoqun12.blog.163.com/blog/static/116062504201152834814661/ 在W ...

  6. xdebug调试时出错 --mxp

    昨天在远程调试时,刚开始调试的好好的,突然发现返回的结果变成502了,不对呀!刚刚明明是200的呀!然后我重启了nginx和php-fpm,还是一样的502,难道是代码又有bug了.看了下php-fp ...

  7. 101个MySQL调试和优化技巧

    101个MySQL调试和优化技巧 MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化 MySQL安装的技巧.一些 ...

  8. netbeans php 断点调试,windows7 + iis7 + fastcgi + php5 + netbeans + xdebug 调试 php

    Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况. windows7 + iis7 + fastcgi + php5 + netbe ...

  9. 使用zend studio配置Xdebug调试PHP教程

    之前我介绍了PHP开发工具Zend Studio7入门使用教程,其实使用zend studio调试PHP非常方便,zend studio默认支持调试工具zend debugger也允许使用第三方调试工 ...

  10. 代码测试,调试与优化小结

    http://www.cppblog.com/cuijixin/default.html?page=8 代码测试.调试与优化的小结 by falcon<zhangjinw@gmail.com&g ...

最新文章

  1. LUT 查表反色处理
  2. 以后要把flex用起来
  3. python代码案例详解-我用Python抓取了7000 多本电子书案例详解
  4. python调用rust_转 从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例
  5. 搜狗输入法自定义短语(克制名词解释、背诵类问题)
  6. ViT为何引入cls_token
  7. Httpwatch中http状态码列表
  8. EL表达式与JSTL标签库
  9. 面对未来,与其期待,不如更早开始「自问与探索」| TiDB DevCon 2020 即将开启
  10. 学习记录2——PMSM数学建模——坐标变换理论以及相应的Matlab模块搭建
  11. 迭代模型(Iterative Model)
  12. Django框架项目之支付功能——支付宝支付
  13. TASK9 Boosting
  14. 「数商云案例」打造工业紧固件行业SRM采购业务协同平台,实现高效协同采购
  15. 不是吧?你不知道CSDN浏览器助手?快来看看,助你一“键”封神!
  16. 正向代理与反向代理通俗理解
  17. docker初识_初识Docker - 阮少爷的个人空间 - OSCHINA - 中文开源技术交流社区
  18. 倍福TwinCAT3第三方伺服电机——以汇川IS620N伺服为例子
  19. 基于JAVA和SQL SERVER数据库实现的医院病房信息管理系统
  20. imp-00017 oracle2298,acquireincrement

热门文章

  1. 吴裕雄--天生自然 JAVASCRIPT开发学习:HTML DOM 集合(Collection)
  2. 【CoreBluetooth】iOS 系统蓝牙框架
  3. system.out输出到文件上
  4. 一些牛人的IOS博客,mark下慢慢学习
  5. 博文内部设置目录尝试
  6. [转载] ANTLR——语法分析
  7. Eclipse3.2安装简介
  8. 【云周刊】第200期:云栖专辑 | 阿里开发者们的第6个感悟:享受折磨
  9. 阿里云服务器 发送邮箱 STMP 25端口 465端口问题 Javamail 25被禁用
  10. LabVIEW--为控件添加说明信息