WAMP下PHPStrom使用Xdebug调试的配置以及Xdebug调试原理总结

# 前言

工欲善其事,必先利其器。无论是什么语言,如何高效调试程序是开发者必须掌握的。此前只是懵懂知道怎么使用,此次主要是详细梳理一下在wamp环境下使用phpstrom与xdebug进行PHP程序调试过程以及其中的调试原理


# 开发说明

系统:Windows 10 64bit

PHP环境WAMPServer 3.0.6 & PHP 7.0.10

php_xdebug扩展php_xdebug-2.4.1-7.0-vc-x86_64.dll

phpstrom:phpstrom 2018.1


# Xdebug扩展的安装

Xdebug是一个PHP扩展,Xdebug 2.0版本以上采用DBGp协议,主要对PHP程序扩展了以下功能
- Debuging(调试)
- Profilling(性能分析),附上使用教程传送门

当然,Xdebug还不止这两个功能,有兴趣的(英文好)可以去官网查看详细的说明文档,这里附上传送门

扩展安装
我本地环境使用的是WAMPServer3.0.6集成环境,由于在WAMP的控制面板没有找到Xdebug模块选项,应该是它没有被预先编译进去,所以需要手动为PHP安装Xdebug扩展了,对于是单独安装PHP的,下面涉及到文件路径请参考自己的实际情况修改即可。

  • 下载对应的扩展文件,附上下载地址,下面举例说明一下Windows系统下出现的扩展版本选择问题。
    这里写图片描述
  • 将下载的xxx.dll文件放到PHP安装路径/zend_ext,wamp下面有多个PHP版本,注意扩展文件的PHP版本与wamp中的PHP版本要对应。

  • Apache安装目录/bin/php.ini文件中进行如下配置,注意wamp下有多个php.ini配置文件,如何选择请参考WAMP下不同的php.ini配置文件加载问题,单独安装PHP的就在PHP安装路径/php.ini中配置

; XDEBUG Extension
[xdebug]
; 指定Xdebug扩展文件的路径
zend_extension ="H:/WebDevelopmentEnvironment/wamp64/bin/php/php7.0.10/zend_ext/php_xdebug-2.4.1-7.0-vc14-x86_64.dll"

; 是否开启远程调试,即是否允许向设置的远程主机发送调试信息
xdebug.remote_enable = On

; 是否为使用未知的IP/多个开发人员进行调试,启用的话下面的主机地址将不会被使用
xdebug.remote_host = off

; 远程主机地址(IP/域名),即你的phpstrom所在的主机地址
xdebug.remote_host = myxu.com(这里我使用了虚拟主机)

; phpstrom监听的端口,Xdebug会向该端口发送调试信息
xdebug.remote_port = 9000

; 我的理解是PHPstrom与Xdebug双方约定的通信协议 
xdebug.remote_handler = dbgp

; 通过约定IDE Key ,Xdebug将调试信息发至对应的IDE,也就是调试信息处理程序(请原谅我的半桶水英语)
xdebug.idekey = PHPSTROM(取决你的IDE,可以自定义)

注意:一定要确定上面设置的端口没有被占用

## 命令行下执行检测命令,没有任何输出则说明端口可用
netstat -ano | grep 9000

# PHPStrom 设置

由于启动PHP的Xdebug扩展具有三种方式,其中有一种的PHP程序是在命令行模式下运行的,对应的设置看官方文档,这里主要对在PHPStrom中的两种配置方式进行说明:

  • 通过DBGp Proxy & 浏览器插件启动Xdebug(推荐)

  • 通过PHP Web Page启动Xdebug

第二种启动方式的缺点

第二种方式它麻烦的地方在于,一旦更改了断点设置点,那这个断点设置点对应的访问地址Start Url配置也要去重新设置,在调试过程中这样明显很烦琐。

DBGp Proxy & 浏览器插件

  • 设置DBGp ProxyDebug Port :phpstrom导航栏file–>Setting
    这里写图片描述
    这里写图片描述

  • 安装浏览器插件

  • 插件的IDE key设置(与上面设置xdebug.idekey一致),使用的是Google 浏览器的Xdebug helper,其余的插件参考此项,自行设置
    这里写图片描述

  • 在需要的地方设置断点,进行下面调试步骤
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

2.PHP Web Page

  • 添加一个PHP Web Page 配置
    这里写图片描述
    这里写图片描述

  • 进行相关设置
    这里写图片描述

  • Debug端口也要与php.ini配置中的一致
    这里写图片描述

  • 在phpstrom开启debug,phpstrom会自动在默认浏览器访问我们刚才设置的start url,如果调试窗口长时间没有任何显示,重新刷新一下浏览器页面
    这里写图片描述

phpstrom调试面板说明
这里写图片描述

左侧
绿色三角形 : Resume Program,表示將继续执行,直到下一个中断点停止。
红色方形 : Stop,表示中断当前程序调试。

上方
第一个图形示 :Show Execution Poit,显示当前执行点。
第二个图形示 : Step Over,跳过当前函数。
第三个图形示 : Step Into,进入当前函数內部的程序(相当于观察程序一步一步执行)。
第四个图形示 : Force Step Into,強制进入当前函数內部的程序。
第五个图形示 : Step Out,跳出当前函数內部的程式。
第六个图形示 : Run to Cursor,定位到当前断点处。

框架说明

Frames : 加载的文件列表

Variables : 可以观察到所有全局变量、当前局部变量的数值

Watches : 可以新增变量,观察变量随着程序执行的变化。


# Xdebug调试工作原理

先附上官方文档,下面是个人参考文档和一些文章后的理解。

刚刚接触的时候,就很纳闷PHPStrom、Xdebug、浏览器插三者之间是如何协作完成调试的,它们又各自负责了哪些任务,最疑惑的是在phpstrom点击了调试按钮,php怎么就知道这次访问是要调试而非运行

在详细看下官方文档中的启动Xdebug调试器三种方式之后,这一切就很明了。

  • 对于运行在CLI模式下的PHP程序,如何启动调试器进行调试,这种情况目前来看我用不是很多,就不去尝试,需要的看文档。

  • 通常而言,我们都是通过浏览器输入URL访问PHP程序,这种形式下需要将XDEBUG_SESSION_START=session_name作为参数添加到URL中,或者将XDEBUG_SESSION_START作为post参数,或者通过设置名为XDEBUG_SESSIONcookie

  • 第三种启动方式本质还是第二种,只不过是在浏览器访问URL的时候,如果启动了所安装的调试插件(Xdebug helper等)的调试模式,插件会自动设置一个设置名为XDEBUG_SESSIONcookie

完整的调试过程

#1 phpstrom 启动Xdebug调试器

  • 通过在phpstrom设置DBGp Proxy & 浏览器插件形式启动,本质是浏览器插件为URL添加了名为XDEBUG_SESSIONcookie

  • 通过在phpstrom设置PHP Web Page形式启动,本质是phpstrom调用浏览器访问我们设置的Start URL,同时在URL后面添加了一个XDEBUG_SESSION_START=session_name参数

  • Apache服务器接收到请求,加载PHP & PHP扩展,PHP在处理请求的时候通过参数XDEBUG_SESSION_START=session_name或者名为XDEBUG_SESSIONcookie得知这次请求是要进行程序调试,而非程序执行。

#2 phpstrom与PHP的Xdebug扩展建立连接通信
Xdebug2.0使用的是DBGp协议进行通信,而phpstrom本身也内置了使用该协议进行通信的调试插件。
这里写图片描述

  • PHP的Xdebug扩展根据php.ini中的配置开始与phpstrom建立通信,即根据remote_host & remote_port来发送调试信息

  • 而我们在phpstrom启动调试的时候,无论是使用哪种phpstrom设置,phpstrom开启一个进程监听端口,这个端口号就是phpstrom设置中的Debug Port,一旦Xdebug发送信息,双方则会进行通信连接

## 命令行下查看某个端口对应的进程信息
netstat -ano | grep 端口号

这里写图片描述

#3 开始调试
- phpstrom将我们在调试面板执行的操作通过上一步建立的通信通道发送至Xdebug

  • Xdebug接收phpstrom发送的操作指令,执行对应的调试操作,并将调试结果返回

  • phpstrom接收调试结果,并将其调试结果输出

两种通信情况的配置
在phpstrom与Xdebug通信的时候,会有以下两种情况,这两种情况会造成配置上有点不同。

  • 使用静态IP/单一开发人员:这种情况下,Xdebug知道IDE的地址,发送信息。
    这里写图片描述

  • 使用未知的IP/多个开发人员:该情况下,Xdebug不知道IDE地址,即使设置了remote_host也不会被使用,而是根据请求地址来发送。修改的配置使开启xdebug.remote_connect_back= 1 or On
    这里写图片描述


参考文章

Xdebug调试PHP原理浅析
官方文档

转载请标明原创地址


猜你喜欢

转载自blog.csdn.net/qq_32346189/article/details/81144123
今日推荐