成为高级 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 于 3年前 加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 6

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

3年前 评论

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

3年前 评论

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

3年前 评论

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

3年前 评论

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

3年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!