PHP环境 VirtualBox + Homestead + Xdebug 解决过程

之前本地开发环境一直都是自己搭建的 安装好各个软件关联起来就好了 或者就是 集成软件 后来学习 Laravel 框架后官方推荐使用 Homestead 做为开发环境 然后从 Laravel China 教程搭建了一套环境 windows 环境Mac 环境。 后来换了一次系统后 发现 Xdebug 不能用了…事情的起因大概就是这样了


Xdebug 是什么

Xdebug是PHP的扩展,用于协助调试和开发。
它包含一个用于IDE的单步调试器; 它升级了 PHP 的 var_dump()函数;
它为通知,警告,错误和异常添加了堆栈跟踪;
它具有记录每个函数调用和磁盘变量赋值的功能; 它包含一个分析器;
它提供了与PHPUnit一起使用的代码覆盖功能

如果你还在使用 var_dump echo dd 等 还是赶紧来使用下 xdebug 吧 能提升你的调试效率 还能看到各种变量的变化等

Xdebug 安装

关于安装 点击这里

如果你是使用的上面的开发环境 里面已经集成好了 可以通过 phpinfo() 来输出信息

如果你看到下面的信息就是安装成功了
xdebug3

需要注意一下 因为我的环境里有 4 个版本的 PHP 所以一定要确认你当前web端访问的那个是哪个版本的PHP 最好的办法就是通过 phpinfo() 来确认 如果是从服务里直接执行的 PHP 命令 是使用的 php-cli 模式

运行的是默认的 PHP 在我的环境里也就是7.2的 而 FPM 执行的是 7.1的 PHP

IDE 与 Xdebug 的通信

IDE 与 Xdebug之间的通信有2种方式

静态绑定客户端

通信流程大概入下图

xdebug1

在上面的 配置 xdebug.remote_connect_back = 0

xdebug 在收到调试通知时会读取配置 xdebug.remote_hostxdebug.remote_port

默认是 localhost:9000,然后向这个端口发送通知

根据请求动态获取IP

这种通信流程如下

xdebug2

也就是上面的配置 把 xdebug.remote_connect_back = 1 即可 这个时候 将会忽视 remote_host 的配置,以请求来源的 IP 作为 xdebug 响应的 IP

Xdebug 配置

首先找到 PHP 的扩展配置目录 不同环境配置不同 路径也不同 我的路径大概如下

1
2
3
4
vagrant@homestead:/etc/php$ pwd
/etc/php
vagrant@homestead:/etc/php$ ls
5.6 7.0 7.1 7.2

因为我是使用的 7.1 版本的PHP 所以进入到7.1目录下 /etc/php/7.1/mods-available 在这个目录下 会有很多的扩展配置文件

编辑 xdebug.ini 文件 这个是我的配置 不要直接抄袭 有几个参数需要改下

1
2
3
4
5
6
7
8
9
10
zend_extension=xdebug.so
xdebug.max_nesting_level=512
xdebug.remote_enable=1
xdebug.remote_connect_back=0
xdebug.remote_port=9002
xdebug.scream=0
xdebug.show_local_vars=1
xdebug.idekey=PHPSTORM
xdebug.remote_host=192.168.1.32
xdebug.remote_log = /tmp/xdebug.log

默认端口是 9000 这里我是自己随便改的 只要改了后和IDE中设置的端口一致就可以了

你可以改 也可以不改 另外 日志目录 一定要设置下 方便排错

我遇到的问题

我本地是采用的第一种绑定IP的形式, 因为我在使用 VirtualBox 虚拟机的时候把网络固定了 192.168.10.1 一直是这个IP

而我本机的IP是 192.168.1.32 当我第一次采用动态获取IP地址的时候调试 xdebug 一直是失败的 最后查看下日志发现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Log opened at 2018-10-25 06:46:27
I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Checking header 'REMOTE_ADDR'.
I: Remote address found, connecting to 192.168.10.1:9002.
E: Time-out connecting to client (Waited: 200 ms). :-(
Log closed at 2018-10-25 06:46:28
Log opened at 2018-10-25 06:48:51
I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Remote address found, connecting to 192.168.1.32:9002.
I: Connected to client. :-)
-> ....

根据上面的第一次错误信息可以看到 xdebug在尝试连接 192.168.10.1 这个地址 从虚拟机里直接ping 这个地址是不通的

所以我把本地的ip地址也给固定死了

直接使用了绑定IP的方式 你们不要学我,如果哪天ip地址变了也要来改这里

然后重启 FPM 我的版本是 php7.1

1
sudo service php7.1-fpm restart

至此我的问题是解决了 总结2点


一、理解原理
二、多看日志

下面就只是一个Xdebug的安装教程方便自己回忆

PHPStorm的配置

设置 PHP 的版本 以及 CLI 的版本

不设置也可以 如下图:

step2

讲下 Cli Interpreters 的设置

点击后面的 ... 进入
然后添加 选择 From Docker, Vagrant,VM,Remote
然后单击选中 Vagrant 因为我是用的vagrant管理虚拟机的(请根据自己的实际情况选择)
然后 Vagrant Instance F... 选择你的 Homestead 目录即可 不需要进入目录里 比如我的 E:/Homestead
最后他会自己加载到你的PHP-CLI版本信息等

设置PHP-Debug

step3

注意配置的端口号要和你的 xdebug.ini 中配置的端口号一致 上面2个不要勾选 勾了刚进入的时候就会启动调试

设置PHP-Server

step4

注意 Host 里设置你的项目访问地址 如果有配置虚拟主机域名的 可以填你的配置域名 然后端口80 后面选 Xdebug

因为是使用的虚拟机 所以要勾选 Use Path mappings 目录映射

首先是本地的项目目录 然后后面的 绝对路径写虚拟机中的绝对路径 如上图 这里一定要映射不然会找不到

设置 Debug

在下面位置设置Debug测试

step5

然后新建一个 PHP Web Application 设置如下

step6

Server一项选择签名创建的Server名字 路径写 / 就好了 表示项目全路径

测试 Debug

打开监听 如下图

step7

在代码中设置断点 然后点击那个小虫子图标启动 当执行到断点的时候 在IDE的控制面板中 出现下图即表示成功了

step8

Chrome 中 Xdebug 插件配置

其实上面已经可以了 不设置浏览器debug插件也可以的 如果你不想每次都点击那个小虫子来启动debug的话 可以继续往下看 安装一个Chrome的Xdebug插件 每次运行到你的断点的时候他会自动检测到

Xdebug-helper 插件下载

下载地址:https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc

安装成功后会在浏览器的插件栏里 一样是一个小虫子的图标 点击后有4个选择

1.Debug
2.Profile
3.Trace
4.Disabled

点击Debug的时候就表示启动了 然后会默认选中这个选项 他会记住域名的

Xdebug-helper 插件配置

在那个小虫子图标上点击 右键->选项 进入配置页面

找到 IDE Key 一项 选择自己使用的 IDE 工具 这里我是 PHPStorm 可以看到他默认的值是 PHPSTORM 不能修改(至今不知道怎么在chrome里修改它…) 上面的配置里已经设置过了这个值 默认即可

现在输入域名访问下 然后启动浏览器插件里的debug 点击使那个小虫子图标变绿就表示启动了

然后在代码里打上断点 当浏览器放到断点的代码时 IDE 中的控制台看到和上面一样成功的界面就表示Xdebug启动成功

参考

https://laravel-china.org/articles/4090/the-first-step-to-becoming-a-senior-php-programmer-debugging-xdebug-principle

https://juejin.im/entry/58fdc9868d6d8100589d826a

https://segmentfault.com/a/1190000016366104


-------------The End-------------