1. 什么是Xdebug
Xdebug是一款用于调试PHP脚本的调试插件,利用自研的DBGP协议进行调试数据传输。
2. Xdebug能干什么
用于PHP代码调试,快速定位问题。
3. 为什么要用Xdebug,有什么其他选项吗
Xdebug可以说是目前PHP生态下做得最好的一款调试器,能和多款IDE便捷的结合使用,并且有开放的DBGP协议可以自定义连接调试。其他的调试办法也有,诸如通过内置的API如echo,printf,var_dump,抛出异常等;也可以利用浏览器进行调试,一种是直接在页面输出结果,另一种是采用FirePHP;再一种就是使用专门的Debugger,如Xdebug,Zend Debugger等,其中Xdebug是目前为止最好用的。
4. 怎么安装Xebug
和常用的安装PHP扩展的方式一致,可以采用源码安装,系统自带命令安装(如apt、yum),pecl方式安装,以及phpize方式安装。
这里采用phpize方式安装,首选需要下载适合的xdebug版本:
https://xdebug.org/download.php
,然后点击source下载
下载好后通过scp命令等上传到服务器,执行 tar -zxvf xdebug.tgz
进入xdebug目录,执行phpize命令:如 /home/xiaoju/php/bin/phpize
然后进行configure,注意填写你实际的php-config地址,如:./configure --with-php-config=/home/xiaoju/php/bin/php-config --enable-xdebug
接着进行 make && make install,确保这个过程没有问题,成功后会输出extension的地址,复制好这个地址
接下来编辑php.ini,增加一行:zend_extension=刚刚你复制的地址/xdebug.so
重启php-fpm,查看phpinfo,就能看到xdebug出现了
5. Xdebug该怎么配置呢
5.1 服务端配置
我们可以接着上一项的位置接着配置php.ini,比较关键的几个参数书:
[Xdebug]
zend_extension=/home/user/php7/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so
; 启用远程调试
xdebug.remote_enable=1
; 如果开启此项配置,将忽略 xdebug.remote_host 的参数
; 浏览器访问任意 php 页面时,服务器会以当前客户端 IP 作为 remote_host
xdebug.remote_connect_back=0
; 绑定远程调试主机地址
xdebug.remote_host=localhost
; 远程主机监听的端口
xdebug.remote_port=9000
; 是否自动启动
xdebug.remote_autostart=1
; 远程追踪
xdebug.remote_trace=on
; 默认开启
xdebug.default_enable=on
; 远程传输协议
xdebug.remote_handler=dbgp
; 远程模式?
xdebug.remote_mode=req
; IDE中配置的KEY
xdebug.idekey=PHPSTORM
xdebug.auto_profile=on
xdebug.collect_params=on
xdebug.collect_return=on
xdebug.profiler_enable=on
xdebug.trace_output_dir="/home/user/logs/xdebug/"
xdebug.profiler_output_dir="/home/user/logs/xdebug/"
如果你是本地调试的话,xdebug.remote_host配置为localhost就行,
需要注意的是,如果你是远程调试的话,这里有两种模式,一种是固定ip模式,一种是根据会话信息自动获取ip。
这两种模式的区别点在于配置xdebug.remote_connect_back 的值,如果为0则为固定ip模式,如果为1则为自动模式,这样就可以忽略配置xdebug.remote_host
那么是如何开启会话的呢?
PHP允许动态识别是否启动调试,当我们访问任意的PHP页面是,如果包含了XDEBUG_SESSION_START参数,就会开启Xdebug调试。
5.2 IDE配置——以PHPStorm为例
配置IDE我们需要简单的了解一下DBGP协议,这样明白为何这样配置,DBGP是Debugger Protorl的简写,是Xdebug自定义的一套标准调试器协议,通过在服务端和客户端建立端口连接进行调试信息的传输。具体的协议内容和解释可以参考下方相关资料。
首先我们需要在PHPStorm里找到Language & Frameworks > PHP > Debug 配置里面的Xdebug端口为你设定的端口,比如9000,这里的9000的意思是在本地建立的监听端口,而非服务器端口。然后勾选Xdebug下的其他选项。
![640?wx_fmt=png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=a3ef8e2c-4030-eb11-8da9-e4434bdf6706&url=https://mmbiz.qpic.cn/mmbiz_png/c0iax0MejQwibO2PsfIbSiaZib0QAUO3PDYgSOVy8gQBQLkQrK1ziaWLO86g4uWk6jw7Ffu0SxxicIyTd9YPyqgic9Rkg/640?wx_fmt=png)
接着,展开Debug,选中DBGp Proxy选项,配置IDEKEY(php.ini中的xdebug.IDEKEY),Host填写服务器地址,Port填写服务器访问端口。
![640?wx_fmt=png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=a3ef8e2c-4030-eb11-8da9-e4434bdf6706&url=https://mmbiz.qpic.cn/mmbiz_png/c0iax0MejQwibO2PsfIbSiaZib0QAUO3PDYgUvzkT1MmuTQoicKFRdPlSkVdsH8fzDH0jaZHXgrgqHicXcPcVVLV6QVw/640?wx_fmt=png)
选择Debug下方的Servers,点击添加,新增一个Server,Debugger选择Xdebug,勾选Use path mappings,左边填写本地项目地址,右边选择线上项目地址,这样的目的是便于在进行调试的时候进行文件映射,IDE能方便的打开跳转到相关文件。
![640?wx_fmt=png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=a3ef8e2c-4030-eb11-8da9-e4434bdf6706&url=https://mmbiz.qpic.cn/mmbiz_png/c0iax0MejQwibO2PsfIbSiaZib0QAUO3PDYgEiccJ4gBXuVbXx8zeeibX2avicZIZ07PFsVdJTzx3vqRCzABC15jkpicdQ/640?wx_fmt=png)
点击Apply再点击Ok结束在这里的配置。
![640?wx_fmt=png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=a3ef8e2c-4030-eb11-8da9-e4434bdf6706&url=https://mmbiz.qpic.cn/mmbiz_png/c0iax0MejQwibO2PsfIbSiaZib0QAUO3PDYg7P57hLoicTqYCFq9icJJiaDr5VnibMyMicVhVrbJ5XdIGawSTCgAN1tHd6w/640?wx_fmt=png)
接着最后一步配置,在主界面找到右上方这个位置,在下拉框下拉,点击Edit Configurations
![640?wx_fmt=png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=a3ef8e2c-4030-eb11-8da9-e4434bdf6706&url=https://mmbiz.qpic.cn/mmbiz_png/c0iax0MejQwibO2PsfIbSiaZib0QAUO3PDYgB00f8LfDNhxgCFhu2hMgjUWFtzBr18x4Jl99VRXcoMGf4FRtBcibCOw/640?wx_fmt=png)
点击添加,选择 PHP Web Page,Server选择我们之前配置的,设置好初始调试路径,也可以设置为根目录,之后再修改,保存即可。
6. 安装好了该怎么进行调试呢?
还是在刚刚右上角配置调试信息的地方,可以选择手动调试模式(第一个按钮)和监听模式(第二个按钮,电话样式的),这两个的区别在于如果你配置的是固定ip,然后开启了电话那个监听,就可以不带参数(XDEBUG_SESSION_START)就可以成功换起调试了,但是需要注意的是,这样的话每一个PHP请求都会被分发过来,所以还是采用第一种好一点,按那个小虫子。
![640?wx_fmt=png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=a3ef8e2c-4030-eb11-8da9-e4434bdf6706&url=https://mmbiz.qpic.cn/mmbiz_png/c0iax0MejQwibO2PsfIbSiaZib0QAUO3PDYgKBV6MNgicibYb3V3ekEN0PJhaa3icXneyKQ6MQ3vGPMT7Ws5fWtLFVZFw/640?wx_fmt=png)
然后就会先打开浏览器页面,再跳转到这边来了,如下可以看到目前到了哪个断点,哪一行,程序的堆栈信息这些的。
![640?wx_fmt=png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=a3ef8e2c-4030-eb11-8da9-e4434bdf6706&url=https://mmbiz.qpic.cn/mmbiz_png/c0iax0MejQwibO2PsfIbSiaZib0QAUO3PDYgiaVM8Qy0kZeicJe8jXx4hndiaelddr45bJZSdibedc5vD7ErtnISWqvrbA/640?wx_fmt=png)
如果需要更换调试地址的话,也很简单,如下,跳出当前调试,然后再修改浏览器刚刚那个访问即可(不要去掉XDEBUG_SESSION_START参数)
7. 相关资料
PHP调试技术手册:
http://blog.xiayf.cn/assets/uploads/files/PHP-Debug-Manual-public.pdf
DBGP协议:
https://xdebug.org/docs-dbgp.php
https://paper.seebug.org/308/
https://www.restran.net/2017/09/16/php-xdebug-cmd-exec/