成为高级 PHP 程序员的第一步——调试(xdebug 原理篇)

文章参考:Xdebug工作原理
xdebug 对于许多 phper 应该一点也不陌生。说来惭愧,对于常年使用 var_dumpecho,现在又多了一个dd :sweat_smile: ,来调试程序的猿来说,这种方式实在有点过时。今天花了一些时间好好了解了一下,现在就整理一下这款,能提升你调试效率以及逼格满满的调试利器———— xdebug

先讲一下 xdebug 工作原理,总结为下面几个步骤:

  1. IDE(比如 PhpStorm ,下文所述的客户端)中已经集成了一个遵循 BGDp 的 Xdebug 插件。当要 debug 的时候,点击一些 IDE 的某个按钮,启动这个插件。该插件会启动一个 9000 的端口监听远程服务器发过来的 debug 信息。

    phpstorm 中,开启 / 关闭的位置为:工具栏 > Run > Start / Stop Listening for PHP Xdebug Connetions

  2. 浏览器向 Httpd 服务器发送一个带有 XDEBUG_SESSION_START 参数的请求,服务器收到这个请求之后交给后端的PHP(已开启 xdebug 模块)进行处理。

  3. Php 看到这个请求是带了 XDEBUG_SESSION_START 参数,就告诉 Xdebug,“嘿,我要debug喔,你准备一下”。这时,Xdebug 会向来源 ip 客户端的9000端口(默认是 9000 端口)发送一个debug请求,然后客户端的 9000 端口响应这个请求,那么 debug 就开始了。

    这里通知客户端其实有两种方式,根据 xdebug 的配置 xdebug.remote_connect_back = 0 | 1 使用不同的通知方式,下文会详细介绍

  4. Php 知道 Xdebug 已经准备好了,那么就开始开始一行一行的执行代码,但是每执行一行都会让 Xdebug 过滤一下,Xdebug 在过滤每一行代码的时候,都会暂停代码的执行,然后向客户端的 9000 端口发送该行代码的执行情况,等待客户端的决策(是一句代码还是下一个断点待)。。

  5. 相应,客户端(IDE)收到 Xdebug 发送过来的执行情况,就可以把这些信息展示给开发者看了,包括一些变量的值等。同时向 Xdebug 发送下一步应该什么。

以上就是整个工作流程,下面介绍一下两种通知客户端的方式:

Xdebug 的官方文档给了两张很清楚的交互图

第一种,静态绑定客户端 host

xdebug.remote_connect_back = 0 ,也是 xdebug 的默认方式,这种情况下,xdebug 在收到调试通知时会读取配置 xdebug.remote_hostxdebug.remote_port ,默认是 localhost:9000,然后向这个端口发送通知
file

可以看到,remote_host 的 IP 是固定的,这种方式只适合单一客户端开发调试

第二种,不绑定 IP,根据请求来源通知

xdebug.remote_connect_back = 1,这种方式和上面基本相同,唯一不同的是,php 在 接受 http 请求后,xdebug 会将请求来源的 IP 绑定,并通知

file

以上就是所有 xdebug 工作原理相关的介绍,下一篇讲在 homestead + phpstorm 作为开发环境如何具体配置并使用 xdebug

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 7年前 加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

手动点赞,xdebug 真是利器。除了debug,我还使用其阅读开源项目的代码

7年前 评论

有没有不是IDE集成的,其他的xdebug好使的工具推荐

7年前 评论

@to2False 这个不太清楚,晚上我会写一篇 phpstorm 详细配置,sublime 的配置看情况更新

7年前 评论

@troubleman sublime的xdebug之前装了很神奇,乱跳,所以想找个其他的工具除了IDE

7年前 评论

@trobleman MacGDBp 比较好使 http://laravel-china.github.io/php-the-rig... 这里有讲到

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!