3.8 php调试工具Xdebug使用教程(2018年,2.6版,云客原创)

xdebug是一个php扩展,官方地址:https://xdebug.org/index.php,用于帮助开发者调试代码,本文以目前(2018312日)最新的2.6版本为列来讲解,她具备这些功能:

代替php的错误提示:

在提示中加入配色以强调不同信息

大变量打印:

增强var_dump()print_r()等打印函数的功能,在大变量打印时很有用,避免死机

最大递归保护:

可以设定最大递归次数限制,防止php卡死

函数调用追踪:

能追踪函数调用过程,显示传入和返回的值,内存用量等

代码覆盖分析:

可以找出代码运行时哪些行被执行了

垃圾回收分析:

php执行垃圾回收时显示哪些变量被清理、多少内存被释放等信息

代码性能分析:

可以看出代码各部分的执行时间,找出代码运行效率的瓶颈

远程调试:

配合IDE工具进行远程断点调试,让你一步步追踪代码的执行,查看或设置运行中的各变量值,避免使用var_dump()print_r()等函数,这也是xdebug最常被使用的功能,非常强大。

 

 

安装:

这里以如下环境来说明,其他环境请根据提示操作:

操作系统:Windows 10

php版本:php-7.1.13-nts(32 bit)

下载:https://xdebug.org/download.php

请根据自己的环境(php版本、是否线程安全、位宽等)选择适合的版本,这里笔者依据前文环境选择:

版本:Xdebug 2.6.0PHP 7.1 VC14 (32 bit)  该版本在2018-01-29发布

将下载得到的文件php_xdebug-2.6.0-7.1-vc14-nts.dll放入phpext目录中

修改php.ini文件,加入如下配置:

zend_extension="php_xdebug-2.6.0-7.1-vc14-nts.dll"

执行phpinfo(),如果已经显示了xdebug扩展则说明安装成功,如果没有请检测是否选对了版本

安装完成后要进行实际的使用还需要根据你的目的在php.ini文件中进行特定的配置,以下根据各功能,进行常用说明

 

开启Xdebug方式的错误提示:

只要启用了xdebug扩展那么该功能是默认开启的,将以xdebug的风格进行错误显示,如果想以原php的风格显示可以在配置文件中设置:xdebug.default_enable=0,注意该设置项并不是指关闭xdebug的所有功能

 

配置大变量的显示:

在有些程序中变量会很大,比如著名内容管理系统drupal8中的节点渲染数组,如果直接print_r那么可以将内存8GI5计算机卡死,所以Xdebug提供了配置大变量打印配置以避免这种情况,配置以下配置项:

xdebug.var_display_max_children

整数,默认128,显示的数组子元素或对象属性的最大数量,不限制则设定为-1,远程调试时不受影响

xdebug.var_display_max_data

整数,默认512,显示字符串的最大长度,不限设置为-1,不影响远程调试

xdebug.var_display_max_depth

整数,默认3,显示数组或对象属性时的最大嵌套深度,最大1023,可以用-1指代这个最大数

 

最大递归保护:

设定以下配置项:

xdebug.max_nesting_level

整数,默认为:256,不限设置为-1,无限递归的保护机制,当递归调用达到该设定时程序被中断,注意此时不会出现任何错误提示,而是直接退出程序

 

函数调用追踪:

包括对象方法调用,该功能默认是关闭的,开启后将输出调用数据到一个文件,查看文件即可,配置如下(这里值设定为我们最常用的情况以便复制使用,更多见下文的配置说明):

xdebug.auto_trace=1

;开启追踪,默认是关闭的

xdebug.trace_output_dir="C:\root\xdebug\trace"

;调用追踪数据输出目录

xdebug.trace_output_name="yunke.%s.%u"

;追踪文件的文件名

xdebug.collect_params=4

;收集函数参数的形式

xdebug.collect_return=1

;是否收集函数返回值

xdebug.show_mem_delta=1

;显示内存详情

xdebug.trace_format=0

;追踪文件的格式

 

以上设置将为所有请求产生分析文件,调用追踪分析还可以采用变量触发的方式(可通过浏览器扩展自动完成,这也是推荐方法,见下),也就是在GET/POST cookie中设置变量名XDEBUG_TRACE,它的值是和以下设置项匹配的密钥,配置如下:

xdebug.auto_trace=0

;开启变量触发跟踪时自动跟踪需要关闭

xdebug.trace_enable_trigger=1

xdebug.trace_enable_trigger_value="yunke"

;这就是上述XDEBUG_TRACE变量的值

如访问网址:http://www.test.com/index.php?XDEBUG_TRACE=yunke,即可触发追踪文件的产生

这里"yunke"是一个密钥值,只有和配置文件匹配才能产生分析文件,默认为空字符

 

代码覆盖分析:

该功能可以让我们知道代码执行中哪些行被执行到了,通常用于单元测试,配置如下:

xdebug.coverage_enable=1

;代码覆盖分析开启

 

代码覆盖分析是通过在php代码中调用函数来进行的,过程如下,那将得到一个数组结果:

xdebug_start_code_coverage();//开启覆写

…//被分析的一些代码

var_dump(xdebug_get_code_coverage());//得到一个分析结果数组

 

垃圾回收分析:

该功能默认是关闭的,开启后将输出垃圾回收分析数据到一个文件,查看文件即可,配置如下(这里值设定为我们最常用的情况以便复制使用,更多见下文的配置说明):

xdebug.gc_stats_enable=1

;开启垃圾回收分析

xdebug.gc_stats_output_dir="C:\root\xdebug\gc"

;数据输出目录,默认是/tmp

xdebug.gc_stats_output_name=”gcstats.%s.%u”

;输出文件名,默认是: gcstats.%p

 

程序性能分析:

该功能默认是关闭的,开启后将输出性能分析数据到一个文件,该文件是便于机器解析的文本格式,需要专用软件查看,配置如下(这里值设定为我们最常用的情况以便复制使用,更多见下文的配置说明):

xdebug.profiler_enable=1

;开启性能分析

xdebug.profiler_output_dir="C:\root\xdebug\profiler"

;性能分析文件输出目录

xdebug.profiler_output_name="cachegrind.out.%s.%u"

;性能分析输出文件名

 

以上设置将为所有请求产生分析文件,性能分析还可以采用变量触发的方式(可通过浏览器扩展自动完成,这也是推荐方法,见下),也就是在GET/POST cookie中设置变量名XDEBUG_PROFILE,它的值是和以下设置项匹配的密钥,配置如下:

xdebug.profiler_enable=0

;开启变量触发分析时自动分析需要关闭

xdebug.profiler_enable_trigger=1

xdebug.profiler_enable_trigger_value="yunke"

;这就是上述XDEBUG_PROFILE变量的值

即可触发分析文件的产生,如访问网址:http://www.test.com/index.php?XDEBUG_PROFILE=yunke

这里"yunke"是一个密钥值,只有和配置文件匹配才能产生分析文件,默认为空字符

 

在官网介绍了许多种软件来查看输出的分析文件,其中WinCacheGrind在小型程序分析中尚可,大型程序就力不从心了,甚至会出现错误,经云客测试采用QCacheGrind 效果最好,它是KCacheGrindWindows版本,这里对该软件做一个简单介绍:

打开后左边有一个“Flat Profile”面板,里面第一列“Incl.”是执行时间,包括内部调用的子程序的时间;Self列是自身消耗的时间,不包括子函数调用;Called列是该函数被调用的次数;Function是函数名;Location列是文件位置;

时间是以微秒为单位1=1000000 微秒(μs),以可以采用百分比的方式

 

远程调试:

我们先看一下远程调试的整个过程,首先由浏览器附带特殊参数打开要调试的脚本,脚本开始运行,此时Xdebug会主动向配置好的调试客户端发起一个连接,并采用DBGp协议和调试客户端交互(调试客户端往往就是我们使用的IDE,如phpstorm,它需要监听调试网络端口),调试客户端通过协议让Xdebug一步一步的执行代码,显示或设置程序中的变量内容,在每一步之间Xdebugphp程序挂起暂停执行,这个“步”又叫断点,调试客户端可以通过设置断点来让程序在该处暂停,对于调试客户端而言这又叫做断点调试,整个过程而言是Xdebugphp引擎里一步一步的执行代码并操作这个过程,她接收调试客户端的指令。

要进行远程调试具体操作如下,首先需要以下配置并重启php

xdebug.remote_enable=1

;远程调试开关

xdebug.remote_host=localhost

;远程调试客户端主机地址,也就是IDE所在主机的地址,往往就是localhost

xdebug.remote_port=9000

;远程调试端口

配置好后,我们在浏览器中打开脚本,打开时需要发送GET/POST变量名XDEBUG_SESSION_START或者cookie变量名XDEBUG_SESSION,其值是Xdebug和调试客户端的通信会话id,往往是ide指定的一个特殊字符,如phpstorm指定为“PHPSTORM”,该值可以在xdebug.idekey配置中设定,默认为空字符串;浏览器附加的参数可以通过浏览器扩展自动完成(见下);服务器收到请求后依据xdebug.remote_mode配置项的设定开始调试过程,该配置项如果是“req”那么脚本刚启动时Xdebug就向调试客户端(IDE)发起调试连接,这也是默认值,如果是“jit”那么仅在有错误出现时才发起连接,一旦和IDE的连接建立成功那么就采用DBGp协议进行调试交互。

如果服务器是被多个开发者共享的,那么调试客户机会有多个,而xdebug.remote_host配置项只能设定一个,此时可以将xdebug.remote_connect_back设定为1,那将采用从http头中获取的ip来作为调试客户机的地址。

Xdebug在发起调试连接时默认超时时间为200毫秒,该值在xdebug.remote_timeout配置项中设置,在本机调试该值足够了,如果是远程的网络主机那么需要加大该值以应对网络延迟。

 

 

浏览器插件辅助:

如前文所述,触发方式产生分析、追踪文件和开启远程调试都需要在GET/POST cookie里面设置特定变量和值,那么我们能否让浏览器代劳呢,这是可以的,这里以开发者使用最多的火狐浏览器为列来说明:

先安装辅助插件,打开地址:https://addons.mozilla.org/en-GB/firefox/addon/xdebug-helper-for-firefox/

你将看到Xdebug Helper for Firefox ,点击Add to Firefox,按照提示操作即可

安装完成后需要进行配置:按组合键“ctrl+shift+a”打开附加组件面板,找到Xdebug Helper,点击选项,分别输入IDE远程会话id、分析密钥、追踪密钥(对应配置中xdebug.idekeyxdebug.profiler_enable_trigger_valuexdebug.trace_enable_trigger_value),点击保存,此时新开网页的浏览器地址栏中将出现一个爬虫图标,可以选择四种状态:调试、分析、追踪、禁用,前三种种状态下浏览器打开连接时会附带额外的cookie参数,比如我们选择分析,那么刷新连接时将在cookie中添加XDEBUG_PROFILE变量,值为前文设定的密钥值,这将让Xdebug产生分析文件,函数追踪和远程调试同理。

 

phpstorm调试:

前文说了Xdebug的远程调试是她通过DBGp协议和调试客户端互动的过程,远程调试客户端需要监听网络端口以接收Xdebug发起的调试连接,这里以PhpStorm作为远程调试客户端来讲解具体操作。

PhpStorm是开发者常用ide,这里采用2017.2.4版本,以著名内容管理系统drupal8来说明调试过程,首先你需要安装配置好Xdebug,主机选择:localhost,端口选择默认的9000,火狐浏览器安装了前一节提到的Xdebug Helper for Firefox扩展,然后打开PhpStorm建立的drupal项目(还不知道如何建立项目?请百度或drupal官网),打开:file > Default Settings > Languages &Frameworks > PHP > Debug > Xdebug

端口设定为9000,其他配置项视你情况选择,点击ApplyOK

打开调试配置面板(Run > Edit Configurations),点击左上角加号选择PHP Web Application,输入调试名称(随意),这里输入drupal,点击Server一行的三个点号,打开服务器配置面板,输入服务器名称,url地址和端口,调试器选择Xdebug,路径映射不用勾选,点击应用ok,回到前一个面板,Start URL 输入“/”,浏览器选择安装了Xdebug Helper for Firefox扩展的火狐,应用OK

此时phpstorm界面右上角调试按钮一行的下拉菜单自动选择了刚刚建立的调试“drupal”,点击电话图标(图标听筒变为在听状态)或者点击菜单Run | Start listen for PHP Debug Connections开始监听9000端口,在index文件中设置一个断点(点击代码行号左侧的空白,出现红色圆点),好了一切准备就绪,下面打开火狐浏览器,将地址栏爬虫图标选择为“debug”,打开一个drupal页面,此时phpstrom将打开左下角的调试面板,该面板提供了许多按钮以供你操作代码执行:变量子面板列出了当前作用域所有的变量,在这里你可以查看所有的变量内容;Watches面板可以跟踪变量或表达式的内容;Frames面板列出当前行所在的调用堆栈帧。

如何使用phpstorm进行调试请查看官方文档,不再细述,这里提供一些phpstorm官网提供的调帮助文档页:

安装配置:

https://confluence.jetbrains.com/display/PhpStorm/Zero-configuration+Web+Application+Debugging+with+Xdebug+and+PhpStorm

调试操作:

https://confluence.jetbrains.com/display/PhpStorm/Using+the+PhpStorm+Debugger

 

注意调试开始后将停留在第一个断点所在位置,如果你一个断点也没有设置,那么调试会话将立即结束,你也可以设置调试停留在第一行代码上(选择Run > Break at first line in PHP scripts)。

如果调试过程中浏览器出现500错误,且调试连接断开,很可能是服务器将php程序终止了,如果你是FastCGI 方式运行的Apache,错误日志类似为“End of script output before headers”,请设置服务器配置文件httpd.conf中的FcgidIOTimeoutIPCCommTimeout 参数为你希望的等待时间,单位为秒,其他环境请自行检查超时配置。

 

常用配置:

全部设置及详细见:https://xdebug.org/docs/all_settings,本文只进行大概介绍

xdebug.trace_output_dir

函数调用跟踪数据文件的写入目录,默认为 /tmp,确保可写

xdebug.trace_output_name

追踪文件的文件名指引,默认为:trace.%c  比如:yunke.%s.%u 将输出带路径的脚步名及带微妙的时间,如下:yunke.C__root_test_index_php.1520473784_260486.xt

xdebug.auto_trace

开启函数调用追踪,布尔值,默认为0

xdebug.collect_assignments

布尔值,默认为0,是否在函数追踪中添加变量赋值

xdebug.collect_includes

布尔值,默认为1,是否将include(), include_once(), require() or require_once() 的文件写入追踪文件

xdebug.collect_params

整数,默认0,决定函数追踪的参数收集,0为不收集,1参数的类型和数量,21基础上加工具提示信息,3全变量内容(受到变量输出设置的影响),4全变量内容和变量名,5php序列化内容没有变量名

xdebug.collect_return

布尔值,默认0,是否写入函数调用的返回值到追踪文件

xdebug.show_mem_delta

整数,默认为0,非0值将显示函数调用的内存用量信息

xdebug.trace_format

整型,默认0,追踪文件的格式,0为人类可读格式(时间索引,内存用量等等)1机器易读格式2人类可读格式以网页展现

xdebug.trace_options

整数,默认为0,如果设置为1,那么追踪文件采用追加方式,而不是覆盖

xdebug.var_display_max_children

整数,默认128,显示的数组子元素或对象属性的最大数量,不限制设定为-1,远程调试时不受影响

xdebug.var_display_max_data

整数,默认512,显示字符串的最大长度,不限设置为-1,不影响远程调试

xdebug.var_display_max_depth

整数,默认3,显示数组或对象属性时的最大嵌套深度,最大1023,可以用-1指代这个最大数

xdebug.coverage_enable

布尔,默认为1,是否开启代码覆盖分析,云客实测该设置项无效,开启和得到分析结果需用函数

xdebug.gc_stats_enable

布尔值,默认为0,是否开启垃圾回收统计分析

xdebug.gc_stats_output_dir

垃圾统计分析的写入目录,注意权限

xdebug.gc_stats_output_name

垃圾分析文件的文件名,和追踪分析的文件名规则一样

xdebug.profiler_enable

整数,默认为0,为1时将开启性能分析功能

xdebug.profiler_aggregate

整数,默认0,非0时将多个请求的分析数据写入一个文件中以进行跨请求分析

xdebug.profiler_append

整数,默认0,分析文件是否采用追加模式,文件名的设定对该项有影响

xdebug.profiler_enable_trigger

整数,默认为0,采用触发模式开启分析功能,开启它时需要关闭xdebug.profiler_enable

xdebug.profiler_enable_trigger_value

字符串。默认为“”,触发分析的密钥,配合xdebug.profiler_enable_trigger使用

xdebug.profiler_output_dir

字符串,默认为/tmp,分析文件输出目录

xdebug.profiler_output_name

分析文件名称,默认为cachegrind.out.%p,见xdebug.trace_output_name

xdebug.extended_info

整型,默认为1,是否强制php解析器执行extended_info模式

xdebug.idekey

字符串,默认: *complex*,调试会话id,经云客测试浏览器发送任意值均可开始调试,所以她并非密钥值,但有些调试客户端可以通过它来判断是否接受调试连接,所以最好统一

xdebug.remote_addr_header

默认为空字符串“”,用以指定哪个http头代表调试客户端地址,和xdebug.remote_connect_back 组合使用

xdebug.remote_autostart

布尔值,默认0,通常使用特定变量开始远程调试,如果该项被设置为1,那么总是开启

xdebug.remote_connect_back

布尔值,默认0,解决多人调试问题,忽略设定的固定ip,指示服务器依据请求地址链接

xdebug.remote_cookie_expire_time

整数。默认3600,远程调试cookie超期时间

xdebug.remote_enable

布尔值,默认0,是否启用远程调试

xdebug.remote_host

字符串,默认:localhost,远程调试客户端的地址

xdebug.remote_log

字符串,默认空,远程调试日志文件名

xdebug.remote_mode

字符串,远程调试默认,req脚本一启动就链接,jit当错误发生时链接

xdebug.remote_port

远程调试端主机端口,默认9000

xdebug.remote_timeout

整数,默认200,单位毫秒,等待调试链接的时间

xdebug.default_enable

布尔值,10,开启以xdebug的方式进行错误提示,默认开启

xdebug.max_nesting_level

整数,默认为:256,无限递归的保护机制,当递归调用达到该设定时程序被中断

xdebug.max_stack_frames

整数,默认值-1,设定错误提示时堆栈中有多少个帧被显示

xdebug.scream

布尔值,默认为0,是否禁用“@”,以便错误被强制显示

 

 

xdebug扩展开启后具备的函数:

当扩展被加载后,php脚本中可以使用以下函数:

(这里只列出部分,全部请见https://xdebug.org/docs/all_functions

string xdebug_call_class( [int $depth = 1] )

显示调用类

string xdebug_call_file( [int $depth = 1] )

显示调用文件

string xdebug_call_function( [int $depth = 1] )

返回调用函数

int xdebug_call_line( [int $depth = 1] )

返回调用行

void xdebug_disable()

禁用堆栈跟踪

void xdebug_enable()

开启堆栈跟踪

bool xdebug_is_enabled()

检查堆栈跟踪是否被开启

string xdebug_get_collected_errors( [int clean] )

从错误集缓冲中返回所有错误信息

array xdebug_get_headers()

返回header() 函数设置的所有头信息

nt xdebug_memory_usage()

返回内存使用量

nt xdebug_peak_memory_usage()

返回到目前为止脚本使用过的最大内存用量

void xdebug_start_error_collection()

收集错误并禁止显示

void xdebug_stop_error_collection()

停止错误记录,并从缓冲中收集

float xdebug_time_index()

返回当前点的执行时间,单位秒

本书共27小节。


评论 (0)