# 前言
工欲善其事,必先利其器。无论是什么语言,如何高效调试程序是开发者必须掌握的。此前只是懵懂知道怎么使用,此次主要是详细梳理一下在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 Proxy
与Debug Port
:phpstrom导航栏file–>Setting
安装浏览器插件
Google:Xdebug helper
Firefox:the-easiest-xdebug
插件的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_SESSION
的cookie
第三种启动方式本质还是第二种,只不过是在浏览器访问URL的时候,如果启动了所安装的调试插件(Xdebug helper等)的调试模式,插件会自动设置一个设置名为
XDEBUG_SESSION
的cookie
完整的调试过程
#1 phpstrom 启动Xdebug调试器
通过在phpstrom设置
DBGp Proxy & 浏览器插件
形式启动,本质是浏览器插件为URL添加了名为XDEBUG_SESSION
的cookie
通过在phpstrom设置
PHP Web Page
形式启动,本质是phpstrom调用浏览器访问我们设置的Start URL
,同时在URL后面添加了一个XDEBUG_SESSION_START=session_name
参数Apache服务器接收到请求,加载PHP & PHP扩展,PHP在处理请求的时候通过参数
XDEBUG_SESSION_START=session_name
或者名为XDEBUG_SESSION
的cookie
得知这次请求是要进行程序调试,而非程序执行。
#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
参考文章
转载请标明原创地址