Xdebug: 协助调试与开发

远程调试

原理

Xdebug使用DBGp(2.1版本之后只支持DBGp),与支持DGBp的终端建立连接(如:PHPStorm),Xdebug在服务端过滤每一行执行代码并暂停,向终端发送执行情况,并等待终端决策(断点等)。DBGp - A common debugger protocol for languages and debugger UI communication

使用Wireshark抓取PHP Server [PSH,ACK]的消息 (过滤条件:tcp.port==9000 && tcp.flags.push == 1)

通信设置

静态IP / 单个开发者

Xdebug收到调试请求,并与 xdebug.remote_host & xdebug.remote_port 建立连接

动态IP / 多个开发者

xdebug.remote_connect_back = 1时,Xdebug收到调试请求,并与检测到的请求IP & xdebug.remote_port 建立连接

配置参数

php.ini

[xdebug]
zend_extension = "xdebug.so"
xdebug.enable = 1
xdebug.idekey = "PHPSTORM"
;xdebug.profiler_enable = 1
xdebug.remote_enable = 1
xdebug.remote_connect_back = 0
xdebug.remote_mode = "req"
xdebug.remote_handler = "dbgp"
xdebug.remote_host = 192.168.99.1
xdebug.remote_port = 9000
;xdebug.remote_autostart = 1
xdebug.remote_log= "/tmp/xdebug.log"

不要忘记重启php-fpm

sudo service php-fpm restart

PHPSTORM配置

针对单文件调试

PhpStorm -> Preferences -> Languages & Frameworks -> PHP -> CLI Interpreter

针对项目调试

PhpStorm -> Preferences -> Languages & Frameworks -> PHP -> Debug PhpStorm -> Preferences -> Languages & Frameworks -> PHP -> Servers

HTTP Debug Sessions

当HTTP请求GET/POST传递XDEBUG_SESSION_START变量、或者CookieXDEBUG_SESSION设置值,Xdebug才会尝试连接到调试终端。一般可以安装浏览器助手,省去手写Debug Sessions变量(如: ?XDEBUG_SESSION_START=PHPSTORM

浏览器Xdebug助手

最终结果


Yan Peipan 31 October 2018