Xdebug从入门到精通
  在 PHP 分类下   暂无评论

Xdebug从入门到精通

  在 PHP 分类下   暂无评论

前言

Xdebug 是 PHP 的扩展,用于协助调试和开发。

必备的工具。
但不推荐在生产环境中使用 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 端口的链接。

图1

当浏览器发送一个带 XDEBUG_SESSION_START 的参数的请求到服务器时,服务器接受后将其转到后端的 php 处理,如果 php 开启了 XDebug 模块,则会将 debug 信息转发到客户端 IP 的 IDE 的调试端口上。

图2

当参数或者 cookie 信息中不带 XDEBUG_SESSION_START ,则不会启动调试。这就为后续在浏览器中添加开关提供了可能。

基本配置

一般情况下,你都只需了解,无需修改。

名称类型默认值注解
xdebug.default_enableboolean1堆栈跟踪,默认开启,是 xdebug 基础功能之一
xdebug.force_display_errorsinteger0默认关闭,如果这个设置设置为 1,那么无论 PHP 的 display_errors 设置为什么,都将始终显示错误。
xdebug.force_error_reportinginteger0默认关闭,允许强制显示某些错误
xdebug.halt_levelinteger0默认关闭,设置接收某些指定错误
xdebug.max_nesting_levelinteger256控制无限递归(死循环)的保护机制,默认是 256
xdebug.max_stack_framesinteger-1控制有多少堆栈帧显示在堆栈跟踪中,在 PHP 错误堆栈跟踪的命令行中,以及在浏览器中显示 HTML 跟踪。
xdebug.screamboolean0默认关闭,如果该设置为 1,那么 Xdebug 将禁用@(关闭)操作符,以便不再隐藏通知、警告和错误。

具体内容请移步官网 https://xdebug.org/docs/basic

打印配置

Xdebug 将替换 PHP 的 var_dump()函数来显示变量。Xdebug 版本包含了不同类型的不同颜色,并对数组元素/对象属性的数量、最大深度和字符串长度进行了限制。还有一些其他函数也处理变量显示。

名称类型默认值注解
xdebug.cli_colorinteger0cli 模式下输入结果是否设置颜色
xdebug.overload_var_dumpboolean2是否允许 xdebug 重载 var_dump 函数
xdebug.var_display_max_childreninteger128var_dump 对数组对象子级的显示层数限制
xdebug.var_display_max_datainteger512var_dump 对结果长度的限制
xdebug.var_display_max_depthinteger3var_dump 对默认显示嵌套的层数的限制

具体内容请移步官网 https://xdebug.org/docs/display

堆栈跟踪配置

当 Xdebug 被激活时,当 PHP 决定显示一个通知、警告、错误等时,它将显示一个堆栈跟踪。堆栈跟踪显示的信息以及它们的显示方式可以配置为适合您的需要。

名称类型默认值注解
xdebug.cli_colorinteger0cli 模式下输入结果是否设置颜色
xdebug.collect_includesboolean1控制 Xdebug 是否应该将 include()、include_once()、require()或 require_once()中的文件名写入跟踪文件
xdebug.collect_paramsinteger0该设置默认为 0,控制当函数跟踪或堆栈跟踪记录函数调用时,Xdebug 是否应该收集传递给函数的参数
xdebug.collect_varsboolean0这个设置告诉 Xdebug 在特定范围内使用哪些变量。由于 Xdebug 必须逆向工程 PHP 的操作码数组,这种分析可能相当缓慢。对于使用 xdebug.collect_params,此设置不会记录不同变量的值。只有当您希望使用 xdebug_get_declared_vars()时,才需要启用此设置。
xdebug.dump.*stringempty* 可以是任何 COOKIE、文件、GET、POST、REQUEST、SERVER、SESSION。这七个设置控制在发生错误时显示来自超全局变量的哪些数据。
xdebug.dump_globalsboolean1当该设置设置为 true 时,Xdebug 将添加通过 Xdebug.dump 配置的超级全局变量的值*到屏幕上的堆栈跟踪和错误日志。
xdebug.dump_onceboolean1控制是否应该在所有错误情况(设置为 0)上转储超全局变量的值,或只在第一个错误情况下转储超全局变量的值(设置为 1)
xdebug.dump_undefinedboolean0如果您想从超全局变量中转储未定义的值,您应该将该设置设置为 1,否则将其设置为 0。
xdebug.file_link_formatstring 文件链接格式

具体内容请移步官网 https://xdebug.org/docs/stack...

函数调试配置

Xdebug 允许记录所有函数调用,包括参数和以不同格式返回的值。

名称类型默认值注解
xdebug.auto_traceboolean0当将此设置设置为 ture 时,将在脚本运行之前启用函数调用的跟踪
xdebug.collect_assignmentsboolean0该设置默认为 0,控制 Xdebug 是否应该向函数跟踪添加变量赋值。
xdebug.collect_includesboolean1该设置默认为 1,控制 Xdebug 是否应该将 include()、include_once()、require()或 require_once()中的文件名写入跟踪文件。
xdebug.collect_paramsinteger0该设置默认为 0,控制当函数跟踪或堆栈跟踪记录函数调用时,Xdebug 是否应该收集传递给函数的参数。
xdebug.collect_returnboolean0该设置默认为 0,控制 Xdebug 是否应该将函数调用的返回值写入跟踪文件。
xdebug.show_mem_deltainteger0Xdebug 生成的跟踪文件将显示函数调用之间内存使用的差异
xdebug.trace_formatinteger0跟踪文件的格式
xdebug.trace_optionsinteger0当设置为“1”时,跟踪文件将被附加到后面的请求中,而不是被覆盖。
xdebug.trace_output_dirstring/tmp写入跟踪文件的目录,确保 PHP 运行的用户具有该目录的写权限。

具体内容请移步官网 https://xdebug.org/docs/execu...

垃圾收集统计信息

Xdebug 的内置垃圾收集统计信息分析器允许您查明 PHP 内部垃圾收集器何时触发、它能够清理多少变量、它花费了多长时间以及实际释放了多少内存。

名称类型默认值注解
xdebug.gc_stats_enableboolfalse如果启用此设置,则垃圾收集运行的统计信息将自动收集到使用 xdebug.gc_stats_output_dir 设置的给定目录中, 并使用由 xdebug.gc_stats_output_name 配置的自动生成的名称。
xdebug.gc_stats_output_dirstring/tmp将写入垃圾收集统计信息输出的目录,确保将运行 PHP 的用户具有对该目录的写入权限。无法使用 ini_set() 在脚本中设置此设置。
xdebug.gc_stats_output_namestringgcstats.%p此设置确定用于将垃圾回收统计信息转储到的文件的名称。该设置使用格式说明符指定格式,与 sprintf() 和 strftime() 非常相似。有几种格式说明符可用于格式化文件名。

具体内容请移步官网 https://xdebug.org/docs/garba...

远程调试配置

Xdebug 为与运行 PHP 脚本交互的调试器客户机提供了一个接口。

名称类型默认值注解
xdebug.extended_infointeger1控制 Xdebug 是否应该为 PHP 解析器强制执行'extended_info'模式; 这允许 Xdebug 使用远程调试器执行文件/行断点。在跟踪或分析脚本时,您通常希望关闭此选项,因为 PHP 生成的 oparray 将增加大约三分之一的大小,从而减慢脚本速度。无法使用 ini_set()在脚本中设置此设置,但只能在 php.ini 中设置。
xdebug.idekeystringcomplex控制哪些 IDE Key Xdebug 应传递给 DBGp 调试器处理程序。则与客户端通信的 key
xdebug.remote_addr_headerstring""该值将用作$SERVER 超全局数组中的键,以确定用于查找用于“连接回”的 IP 地址或主机名的标头
xdebug.remote_autostartboolean0您需要使用特定的 HTTP GET / POST 变量来启动远程调试
xdebug.remote_connect_backboolean0如果你不设置 ip 地址,就只能靠 xdebug 自己找了,Xdebug 将尝试连接到发出 HTTP 请求的客户端。它检查$\_SERVER\['HTTP\_X\_FORWARDED\_FOR'\]和$_SERVER['REMOTE_ADDR']变量以找出要使用的 IP 地址
xdebug.remote_cookie_expire_timeinteger3600设置 cookie 的生命周期
xdebug.remote_enableboolean0是否开启远程调试
xdebug.remote_handlerstringdbgp调试的通信协议
xdebug.remote_hoststringlocalhost调试的网络地址,开启了 remote_connect_back 后,当前配置就无效了
xdebug.remote_logstring 调试的日志
xdebug.remote_portinteger9000调试的端口
xdebug.remote_timeoutinteger200调试的通信链接的等待时间

具体内容请移步官网 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

图3

第一步

下载 XDEBUG 扩展,本章开头已经讲过了,这里不再阐述。
在安装完成后,PHPSTROM 提供了验证脚本。脚本地址为 https://gist.github.com/litzi...
正常情况下检测成功的样子是

图4

看到这个你就可以放心的去 debug 了。

第二步

装个浏览器插件,用户请求监听。这个东西唯一的作用就是方便了 debug,正常如果不安装的话你需要通过 GET 传参 XDEBUG_SESSION_START=ID_KEY 才可以,安装插件后就不需要了。

图5

你可以自行选择是否开启 debug,以下为浏览器插件列表

浏览器下载
ChromeXdebug Helper
FirefoxThe easiest Xdebug or Xdebug Helper
SafariXdebug Toggler
OperaXdebug launcher
Internet ExplorerPhpStorm bookmarklets generator

第三步

开启监听即可。

图6

你可以直接点击图片上的监听按钮。

到现在为止,就配置好了 IDE。

第四步

创建 DEBUG 配置文件,根据每个项目都要配置。这步你跑不了。

图7

你看,PHPSTORM 非常人性化,在每一步都会给你出个简单的教程来描述如何配置 DEBUG。

添加一个 Server 和 IDE key(xdebug.idekey) 就可以进行调试了。

总结

总结以下 IDE 配置 DEBUG 的步骤,实际很简单。

  1. 下载安装 debug
  2. 验证是否通信正常
  3. 添加浏览器插件 (可省略)
  4. 配置运行文件
  5. 愉快的 debug

这里还要说明下,如果你是不需要访问本机调试一些类或者代码块,你只需要在本机上安装好 XDEBUG,上述配置全部省略,直接点小虫子图标即可调试。DEBUG 端口默认是 9000,如果配置文件内修改了,当然在 IDE 内也需要修改下。

调试

介绍下实际 DEBUG 过程中 PHPSTORM 面板的按钮都是做什么用的。当你启动监听后,你将会看到如下图

图8

根据上图图标位置,以 x,y 坐标的方式描述每个图标的功能。

图9

其他

Docker PHP XDEBUG

部分人在本机装了 Docker,容器中运行这 PHP,这个时候该如何进行 DEBUG 呢?如果认真看本篇文章,你会发现十分的简单。本身 XDEBUG 就是远程调试。首先你要保证

将容器 PHP XDEBUG 中

xdebug.remote_host=local_ip

即可,也不用担心 hosts 文件的问题

本机IP = 127.0.0.1 = localhost

这样配置完成后,就可以当容器不存在,与本机调试一样。

致谢

感谢你看到这里,希望本章内容可以帮到你,谢谢。

评论已关闭