0

0

php调试工具Xdebug详细使用教程

小云云

小云云

发布时间:2018-03-16 11:08:55

|

11664人浏览过

|

来源于php中文网

原创

xdebug是一个php扩展,官方地址:https://xdebug.org/index.php,用于帮助开发者调试代码,本文主要和大家分享php调试工具xdebug详细使用教程,最新的2.6版本为列来讲解,希望能帮助到大家。

它具备这些功能:

代替php的错误提示:

在提示中加入配色以强调不同信息
大变量打印:
增强var_dump()、print_r()等打印函数的功能,在大变量打印时很有用,避免死机
最大递归保护:
可以设定最大递归次数限制,防止php卡死
函数调用追踪:
能追踪函数调用过程,显示传入和返回的值,内存用量等
代码覆盖分析:
可以找出代码运行时哪些行被执行了
垃圾回收分析:
在php执行垃圾回收时显示哪些变量被清理、多少内存被释放等信息
代码性能分析:
可以看出代码各部分的执行时间,找出代码运行效率的瓶颈
远程调试:

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

立即学习PHP免费学习笔记(深入)”;

安装:
这里以如下环境来说明,其他环境请根据提示操作:
操作系统:Windows 10
php版本:php-7.1.13-nts(32 bit)
下载:https://xdebug.org/download.php
请根据自己的环境(php版本、是否线程安全、位宽等)选择适合的版本,这里笔者依据前文环境选择:
版本:Xdebug 2.6.0,PHP 7.1 VC14 (32 bit)  该版本在2018-01-29发布
将下载得到的文件php_xdebug-2.6.0-7.1-vc14-nts.dll放入php的ext目录中
修改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那么可以将内存8G的I5计算机卡死,所以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

《PHP程序设计》第二版
《PHP程序设计》第二版

本书图文并茂,详细讲解了使用LAMP(PHP)脚本语言开发动态Web程序的方法,如架设WAMP平台,安装与配置开源Moodle平台,PHP程序设计技术,开发用户注册与验证模块,架设LAMP平台。 本书适合计算机及其相关专业本、专科学生作为学习LAMP(PHP)程序设计或动态Web编程的教材使用,也适合对动态Web编程感兴趣的读者自觉使用,对LAMP(PHP)程序设计人员也具有一定的参考价值。

下载

程序性能分析:
该功能默认是关闭的,开启后将输出性能分析数据到一个文件,该文件是便于机器解析的文本格式,需要专用软件查看,配置如下(这里值设定为我们最常用的情况以便复制使用,更多见下文的配置说明):
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 效果最好,它是KCacheGrind的Windows版本,这里对该软件做一个简单介绍:
打开后左边有一个“Flat Profile”面板,里面第一列“Incl.”是执行时间,包括内部调用的子程序的时间;Self列是自身消耗的时间,不包括子函数调用;Called列是该函数被调用的次数;Function是函数名;Location列是文件位置;
时间是以微秒为单位1秒=1000000 微秒(μs),以可以采用百分比的方式

远程调试:
我们先看一下远程调试的整个过程,首先由浏览器附带特殊参数打开要调试的脚本,脚本开始运行,此时Xdebug会主动向配置好的调试客户端发起一个连接,并采用DBGp协议和调试客户端交互(调试客户端往往就是我们使用的IDE,如phpstorm,它需要监听调试网络端口),调试客户端通过协议让Xdebug一步一步的执行代码,显示或设置程序中的变量内容,在每一步之间Xdebug将php程序挂起暂停执行,这个“步”又叫断点,调试客户端可以通过设置断点来让程序在该处暂停,对于调试客户端而言这又叫做断点调试,整个过程而言是Xdebug在php引擎里一步一步的执行代码并操作这个过程,她接收调试客户端的指令。
要进行远程调试具体操作如下,首先需要以下配置并重启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.idekey、xdebug.profiler_enable_trigger_value、xdebug.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,其他配置项视你情况选择,点击Apply和OK
打开调试配置面板(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中的FcgidIOTimeout、IPCCommTimeout 参数为你希望的等待时间,单位为秒,其他环境请自行检查超时配置。


常用配置:
全部设置及详细见: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参数的类型和数量,2在1基础上加工具提示信息,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
布尔值,1或0,开启以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()
返回当前点的执行时间,单位秒
相关推荐:

浅述PHP7的安装调试工具Xdebug扩展的方法

关于PHP7如何安装调试工具Xdebug扩展的方法教程(图)

Xdebug配置不成功

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号