1、什么是 xdebug?
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。(摘自百度百科)
个人认为 xdebug 是 php 最好的调试工具,没有之一。对于一些莫名奇妙的问题,代码的执行轨迹、执行了哪些类、调用了哪些类的方法,性能分析等,使用 xdebug 代码跟踪,通过记录日志可以轻松解决。
2、 如何安装xdebug ?
windows 系统下载对应 php 版本的 xdebug.dll 文件,放在 php 的安装目录 ext 文件夹下。
Linux 系统可以使用 php 的 pecl 安装 ,假设 php 的安装目录是 /usr/local/php ,安装命令:
sudo /usr/local/php/bin/pecl install xdebug
安装完后,在 php.ini 文件添加
zend_extension=xdebug.so
//windows系统
zend_extension=xdebug.dll
如果不知道选择哪个版本,可以使用 xdebug 官方的向导功能 Xdebug: Support — Tailored Installation Instructions
使用 phpinfo() 函数输出到浏览器,然后复制浏览器网页源码,输入到向导页面的输入框中。 点击Analyse my phpinfo() output按钮,即可进入结果页面。 结果页面的Instructions下面,就是对应php版本可以下载的Xdebug
3、使用 xdebug 跟踪代码,分析性能
关于 xdebug 的使用,网上铺天盖地的配置 phpstorm、配合浏览器远程调试等教程。似乎 xdebug 用起来那么费事,那么高级,其实大可不必。
最简单也是最直观的调试方式:
xdebug_start_trace();
/* 业务代码 */
xdebug_stop_trace();
设置 php.ini 代码跟踪配置:
zend_extension=/usr/lib64/php/modules/xdebug.so
;代码跟踪日志文件位置,注意要先新建这个traces目录,并设置777
xdebug.trace_output_dir = /tmp
;代码跟踪日志文件格式
xdebug.trace_output_name = trace.%c.%p
xdebug.collect_params = 4
xdebug.collect_includes = On
xdebug.collect_return = On
xdebug.show_mem_delta = On
xdebug.var_display_max_depth = 2
;var_display_max_depth用来设置数组或者对象显示的最大层级。
;默认是3。参见官方文档的说明:Controls how many nested levels of array elements
;and object properties are when variables are displayed
;with either xdebug_var_dump(), xdebug.show_local_vars or through Function Traces.
随后,就可以在配置目录 /tmp 目录下看到类似文件:
trace.287120720.95430.xt
这里截取一段?线上业务生成的日志?示例:
2.1000 12725848 -48 -> G($start = 'queryStartTime', $end = ???, $dec = ???) /www/wwwroot/publish/core/Lib/Driver/Db/DbMysql.class.php:120
2.1000 12725992 +144 -> is_float('') /www/wwwroot/publish/admin/Runtime/~runtime.php:1
>=> FALSE
2.1001 12726040 +48 -> microtime(TRUE) /www/wwwroot/publish/admin/Runtime/~runtime.php:1
>=> 1639033263.8905
2.1001 12725992 -48 -> memory_get_usage() /www/wwwroot/publish/admin/Runtime/~runtime.php:1
>=> 12725992
>=> NULL
2.1002 12725896 -96 -> mysql_query('SELECT distinct(uid) FROM `pt_lazada_cron_products` WHERE ( status in(4,5) ) ', resource(13) of type (mysql link)) /www/wwwroot/publish/core/Lib/Driver/Db/DbMysql.class.php:131
>=> resource(36) of type (mysql result)
16.8569 12725968 +72 -> Db->debug() /www/wwwroot/publish/core/Lib/Driver/Db/DbMysql.class.php:135
16.8569 12726152 +184 -> C($name = 'DB_SQL_LOG', $value = ???) /www/wwwroot/publish/core/Lib/Core/Db.class.php:252
16.8570 12726248 +96 -> is_string('DB_SQL_LOG') /www/wwwroot/publish/admin/Runtime/~runtime.php:1
>=> TRUE
通过日志追踪发现,第 9 行执行耗时?2.1002?秒,到第 11 行代码耗时变成了?16.8569?秒
第 9 行就是性能瓶颈
而第9行执行了一条sql:
SELECT distinct(uid) FROM `pt_lazada_cron_products` WHERE ( status in(4,5) )
所以性能问题就出在这条 sql 上!!!
......
对于接触新的框架,代码执行出现的异常,异常耗时等问题,通过日志追踪可以清晰的发现。
xdebug 还有很多其他玩法,诸如配置 idea 断点调试,配置浏览器远程调试等,有兴趣的可以自己研究。
|