XDEBUG 从入门到精通
前言
Xdebug
是PHP
的扩展,用于协助调试和开发。
- 它包含一个用于
IDE
的调试器 - 它升级了
PHP
的var_dump()
函数 - 它为通知,警告,错误和异常添加了堆栈跟踪
- 它具有记录每个函数调用和磁盘变量赋值的功能
- 它包含一个分析器
- 它提供了与
PHPUnit
一起使用的代码覆盖功能。
猿生必备的工具。
但不推荐在生产环境中使用xdebug
,因为他太重了。
安装
PECL
安装
pecl install xdebug
zend_extension="/usr/local/php/modules/xdebug.so"
源码包安装
https://xdebug.org/download.php 寻找对应的包
wget xxx.gz
./configure
make && make install
zend_extension="/usr/local/php/modules/xdebug.so"
Docker
安装
以下为php dockerfile内部分内容
RUN pecl install xdebug
RUN echo 'zend_extension=xdebug.so' >> /usr/local/etc/php/conf.d/xdebug.ini
工作原理
IDE
(如PHPStorm
)已经集成了一个遵循BGDP
的XDebug
插件,当开启它的时候, 会在本地开一个XDebug
调试服务,监听在调试器中所设置的端口上,默认是9000
,这个服务就会监听所有到9000
端口的链接。
当浏览器发送一个带 XDEBUG_SESSION_START
的参数的请求到服务器时,服务器接受后将其转到后端的php
处理,如果php
开启了XDebug
模块,则会将debug
信息转发到客户端IP
的IDE
的调试端口上。
当参数或者cookie
信息中不带 XDEBUG_SESSION_START
,则不会启动调试。这就为后续在浏览器中添加开关提供了可能。
基本配置
一般情况下,你都只需了解,无需修改。
名称 | 类型 | 默认值 | 注解 |
---|---|---|---|
xdebug.default_enable | boolean | 1 | 堆栈跟踪,默认开启,是xdebug基础功能之一 |
xdebug.force_display_errors | integer | 0 | 默认关闭,如果这个设置设置为1,那么无论PHP的display_errors设置为什么,都将始终显示错误。 |
xdebug.force_error_reporting | integer | 0 | 默认关闭,允许强制显示某些错误 |
xdebug.halt_level | integer | 0 | 默认关闭,设置接收某些指定错误 |
xdebug.max_nesting_level | integer | 256 | 控制无限递归(死循环)的保护机制,默认是256 |
xdebug.max_stack_frames | integer | -1 | 控制有多少堆栈帧显示在堆栈跟踪中,在PHP错误堆栈跟踪的命令行中,以及在浏览器中显示HTML跟踪。 |
xdebug.scream | boolean | 0 | 默认关闭,如果该设置为1,那么Xdebug 将禁用@(关闭)操作符,以便不再隐藏通知、警告和错误。 |
具体内容请移步官网 https://xdebug.org/docs/basic
打印配置
Xdebug
将替换PHP
的var_dump()
函数来显示变量。Xdebug
版本包含了不同类型的不同颜色,并对数组元素/对象属性的数量、最大深度和字符串长度进行了限制。还有一些其他函数也处理变量显示。
名称 | 类型 | 默认值 | 注解 |
---|---|---|---|
xdebug.cli_color | integer | 0 | cli模式下输入结果是否设置颜色 |
xdebug.overload_var_dump | boolean | 2 | 是否允许xdebug 重载var_dump 函数 |
xdebug.var_display_max_children | integer | 128 | var_dump 对数组对象子级的显示层数限制 |
xdebug.var_display_max_data | integer | 512 | var_dump 对结果长度的限制 |
xdebug.var_display_max_depth | integer | 3 | var_dump 对默认显示嵌套的层数的限制 |
具体内容请移步官网https://xdebug.org/docs/display
堆栈跟踪配置
当Xdebug
被激活时,当PHP
决定显示一个通知、警告、错误等时,它将显示一个堆栈跟踪。堆栈跟踪显示的信息以及它们的显示方式可以配置为适合您的需要。
名称 | 类型 | 默认值 | 注解 |
---|---|---|---|
xdebug.cli_color | integer | 0 | cli模式下输入结果是否设置颜色 |
xdebug.collect_includes | boolean | 1 | 控制Xdebug 是否应该将include() 、include_once() 、require() 或require_once() 中的文件名写入跟踪文件 |
xdebug.collect_params | integer | 0 | 该设置默认为0,控制当函数跟踪或堆栈跟踪记录函数调用时,Xdebug 是否应该收集传递给函数的参数 |
xdebug.collect_vars | boolean | 0 | 这个设置告诉Xdebug 在特定范围内使用哪些变量。由于Xdebug 必须逆向工程PHP 的操作码数组,这种分析可能相当缓慢。对于使用xdebug.collect_params ,此设置不会记录不同变量的值。只有当您希望使用xdebug_get_declared_vars() 时,才需要启用此设置。 |
xdebug.dump.* | string | empty | * 可以是任何COOKIE 、FILE 、GET 、POST 、REQUEST 、SERVER 、SESSION 。这七个设置控制在发生错误时显示来自超全局变量的哪些数据。 |
xdebug.dump_globals | boolean | 1 | 当该设置设置为true 时,Xdebug 将添加通过Xdebug.dump 配置的超级全局变量的值* 到屏幕上的堆栈跟踪和错误日志。 |
xdebug.dump_once | boolean | 1 | 控制是否应该在所有错误情况(设置为0)上转储超全局变量的值,或只在第一个错误情况下转储超全局变量的值(设置为1) |
xdebug.dump_undefined | boolean | 0 | 如果您想从超全局变量中转储未定义的值,您应该将该设置设置为1,否则将其设置为0。 |
xdebug.file_link_format | string | 文件链接格式 |
具体内容请移步官网 https://xdebug.org/docs/stack_trace
函数调试配置
Xdebug
允许记录所有函数调用,包括参数和以不同格式返回的值。
名称 | 类型 | 默认值 | 注解 |
---|---|---|---|
xdebug.auto_trace | boolean | 0 | 当将此设置设置为ture 时,将在脚本运行之前启用函数调用的跟踪 |
xdebug.collect_assignments | boolean | 0 | 该设置默认为0,控制Xdebug 是否应该向函数跟踪添加变量赋值。 |
xdebug.collect_includes | boolean | 1 | 该设置默认为1,控制Xdebug 是否应该将include() 、include_once() 、require() 或require_once() 中的文件名写入跟踪文件。 |
xdebug.collect_params | integer | 0 | 该设置默认为0,控制当函数跟踪或堆栈跟踪记录函数调用时,Xdebug 是否应该收集传递给函数的参数。 |
xdebug.collect_return | boolean | 0 | 该设置默认为0,控制Xdebug是否应该将函数调用的返回值写入跟踪文件。 |
xdebug.show_mem_delta | integer | 0 | Xdebug 生成的跟踪文件将显示函数调用之间内存使用的差异 |
xdebug.trace_format | integer | 0 | 跟踪文件的格式 |
xdebug.trace_options | integer | 0 | 当设置为“1”时,跟踪文件将被附加到后面的请求中,而不是被覆盖。 |
xdebug.trace_output_dir | string | /tmp | 写入跟踪文件的目录,确保PHP 运行的用户具有该目录的写权限。 |
具体内容请移步官网 https://xdebug.org/docs/execution_trace
垃圾收集统计信息
Xdebug
的内置垃圾收集统计信息分析器允许您查明PHP内部垃圾收集器何时触发、它能够清理多少变量、它花费了多长时间以及实际释放了多少内存。
名称 | 类型 | 默认值 | 注解 |
---|---|---|---|
xdebug.gc_stats_enable | bool | false | 如果启用此设置,则垃圾收集运行的统计信息将自动收集到使用xdebug.gc_stats_output_dir 设置的给定目录中, 并使用由xdebug.gc_stats_output_name 配置的自动生成的名称。 |
xdebug.gc_stats_output_dir | string | /tmp | 将写入垃圾收集统计信息输出的目录,确保将运行PHP 的用户具有对该目录的写入权限。无法使用ini_set() 在脚本中设置此设置。 |
xdebug.gc_stats_output_name | string | gcstats.%p | 此设置确定用于将垃圾回收统计信息转储到的文件的名称。该设置使用格式说明符指定格式,与sprintf() 和strftime() 非常相似。有几种格式说明符可用于格式化文件名。 |
具体内容请移步官网 https://xdebug.org/docs/garba...
远程调试配置
Xdebug
为与运行PHP
脚本交互的调试器客户机提供了一个接口。
名称 | 类型 | 默认值 | 注解 |
---|---|---|---|
xdebug.extended_info | integer | 1 | 控制Xdebug 是否应该为PHP 解析器强制执行extended_info 模式; 这允许Xdebug 使用远程调试器执行文件/行断点。在跟踪或分析脚本时,您通常希望关闭此选项,因为PHP 生成的oparray 将增加大约三分之一的大小,从而减慢脚本速度。无法使用ini_set() 在脚本中设置此设置,但只能在php.ini 中设置。 |
xdebug.idekey | string | complex | 控制哪些IDE Key Xdebug 应传递给DBGp 调试器处理程序。则与客户端通信的key |
xdebug.remote_addr_header | string | "" | 该值将用作$SERVER 超全局数组中的键,以确定用于查找用于“连接回”的IP 地址或主机名的标头 |
xdebug.remote_autostart | boolean | 0 | 您需要使用特定的HTTP GET / POST 变量来启动远程调试 |
xdebug.remote_connect_back | boolean | 0 | 如果你不设置ip 地址,就只能靠xdebug 自己找了,Xdebug 将尝试连接到发出HTTP 请求的客户端。它检查Double subscripts: use braces to clarify_SERVER['REMOTE_ADDR'] 变量以找出要使用的IP地址 |
xdebug.remote_cookie_expire_time | integer | 3600 | 设置cookie 的生命周期 |
xdebug.remote_enable | boolean | 0 | 是否开启远程调试 |
xdebug.remote_handler | string | dbgp | 调试的通信协议 |
xdebug.remote_host | string | localhost | 调试的网络地址,开启了remote_connect_back 后,当前配置就无效了 |
xdebug.remote_log | string | 调试的日志 | |
xdebug.remote_port | integer | 9000 | 调试的端口 |
xdebug.remote_timeout | integer | 200 | 调试的通信链接的等待时间 |
具体内容请移步官网 https://xdebug.org/docs/remote
官方链接
全部配置请移步官网 https://xdebug.org/docs/all_s...
全部函数请移步官网 https://xdebug.org/docs/all_f...
PHPSTORM DEBUG
网络上的配置DEBUG文章太杂太乱,在PHPSTROM跳来跳去的,实在让人心烦意乱,本章重新整理描述。
配置
其实在PHPSTROM
中已经出了很详细的教程,是吧?只不过大部分人都会直接百度/Google,查询是个好习惯,但要视情况而定。
Languages & Frameworks > PHP > Debug
第一步
下载XDEBUG
扩展,本章开头已经讲过了,这里不再阐述。
在安装完成后,PHPSTROM
提供了验证脚本。脚本地址为 https://gist.github.com/litzi...
正常情况下检测成功的样子是
看到这个你就可以放心的去debug
了。
第二步
装个浏览器插件,用户请求监听。这个东西唯一的作用就是方便了debug
,正常如果不安装的话你需要通过GET
传参 XDEBUG_SESSION_START=ID_KEY
才可以,安装插件后就不需要了。
你可以自行选择是否开启debug
,以下为浏览器插件列表
浏览器 | 下载 |
---|---|
Chrome | Xdebug Helper |
Firefox | The easiest Xdebug or Xdebug Helper |
Safari | Xdebug Toggler |
Opera | Xdebug launcher |
Internet Explorer | PhpStorm bookmarklets generator |
第三步
开启监听即可。
你可以直接点击图片上的监听按钮。
到现在为止,就配置好了IDE
。
第四步
创建DEBUG
配置文件,根据每个项目都要配置。这步你跑不了。
你看,PHPSTORM
非常人性化,在每一步都会给你出个简单的教程来描述如何配置DEBUG
。
添加一个Server
和IDE key(xdebug.idekey)
就可以进行调试了。
总结
总结以下IDE
配置DEBUG
的步骤,实际很简单。
- 下载安装debug
- 验证是否通信正常
- 添加浏览器插件 (可省略)
- 配置运行文件
- 愉快的debug
这里还要说明下,如果你是不需要访问本机调试一些类或者代码块,你只需要在本机上安装好XDEBUG,上述配置全部省略,直接点小虫子图标即可调试。DEBUG端口默认是9000,如果配置文件内修改了,当然在IDE内也需要修改下。
调试
介绍下实际DEBUG
过程中PHPSTORM
面板的按钮都是做什么用的。当你启动监听后,你将会看到如下图
根据上图图标位置,以x
,y
坐标的方式描述每个图标的功能。
其他
Docker PHP XDEBUG
部分人在本机装了Docker
,容器中运行这PHP
,这个时候该如何进行DEBUG
呢?如果认真看本篇文章,你会发现十分的简单。本身XDEBUG
就是远程调试。首先你要保证
- 容器做了端口映射到本机
80
- 容器内项目目录做了磁盘挂载
将容器PHP XDEBUG
中
xdebug.remote_host=local_ip
即可,也不用担心hosts文件的问题
本机IP = 127.0.0.1 = localhost
这样配置完成后,就可以当容器不存在,与本机调试一样。
致谢
感谢你看到这里,希望本章内容可以帮到你,谢谢。