Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac
文章目录
前言
曾经我的调试方式:
也许很多小伙伴都和我有相同的经历,假如程序需要排查问题时,默认方式是
echo
、print_r()
、var_dump()
或 Laravel 框架内置的dd()
函数。这种方式非常的简单便捷,很容易上手。但是它也有一些不足之处,比如说:
- 需要在程序中植入打印的代码,操作简单但容易忘记撤回。
- 打印的信息有限,如想打印其他信息,还需新增代码。
- 只能局部的输出,不能展示全局以及全流程的信息输出。
现在我的调试方式:
现在使用上了 PHP 的 xdebug 扩展进行调试,虽然麻烦些但是它值得你为他付出时间与精力。它的优势有:
- 无需在程序中植入代码,您只需在编辑器中选择断点位置即可。
- 打印信息很全面,包括程序执行流程(说到这里,使用它你可以真正了解框架整个执行流程),以及断点位置的各种变量信息。
所以你还在 犹豫什么?
- 也许它如何配置?以及如何使用? 这应该是你最应该关心的。
- 但你所关心的也正是我接下来要讲述的。跟着文章一点一点继续下去,我想你应该会有所获。也会增加你使用
xdebug
的信心。
环境 & 版本号:
- 主机:
MacProBook
- 操作系统:
MacOS Monterey
- 虚拟机工具:
vagrant
- 开发环境:
Homestead v13.2.1
- PhpStorm 版本:
2021.3.3
- PHP 版本:
8.0.13
- Xdebug 版本:
3.1.1
- Laravel 版本:
Laravel 8.83.5
以上是我本机所使用的 PHP
整体的开发环境。可能很多人都和我的不一样,要么是操作系统、要么是开发环境等,不过影响不大。这一篇先保证开发环境是 Homestead
就行,如果你们按照我的方式不能使用,后续我再出新的文章讨论相关细节问题。
进入 Homestead 开发环境
启动 & 进入环境
- 启动环境
cd ~/Homestead && vagrant up
- 进入环境
vagrant ssh
- 进入后,像这一样:
看一下 Homestead.yaml 文件下,我的项目使用的那个 PHP 版本:
- 打开
Homestead.yaml
文件, code 是我配置vscode
编辑器的快捷命令:
cd ~/Homestead && code .
- 查看对应项目使用的 PHP 版本为:
8.0
,其实我这个项目是指定了 PHP 版本,不指定的话使用默认的 PHP 版本。
获取 php.ini 文件
我们知道,要想使用 PHP 的扩展,必须先下载并安装它,最终生成
xxxxx.so
扩展文件,然后在php.ini
文件中引用这个扩展。这样输出的phpinfo()
内容会并显示对应的扩展信息。但是homestead
环境已实现帮我们下载好对应的扩展了,我们只需找到php.ini
配置文件并正确引用它就可以了。
- 查看命令行的 PHP 的版本:
php -v
- 版本号如下:
- 如果版本号不是你项目对应项目的版本号,您可以通过以下命令切换:
# 切换到 8.0
php80
# 切换到 7.4
php74
...
- 您可以通过在虚拟机命令行中输入 php 在加上
tab
键,可以看到支持的所有 php 命令:
- 正常情况下我们通过这种方式查看
php
的配置文件地址:
php --ini
- 但是我发现,命令行输出好多配置文件信息,而且这些配置文件路径都有一个很明显的特征,这些文件都在
/etc/php/8.0/cli
文件夹下:
- 但是这个路径是不行的,因为
/etc/php/8.0/cli
下的配置文件是作用于cli
模式(命令行模式)下执行文件的配置。而不是通过浏览器访问域名,经过nginx
服务器转发到 php 执行文件的配置。然后我就想看一下是否有其他模式,我罗列cli
目录的上一级目录/etc/php/8.0
:
ll /etc/php/8.0
- 发现它有
cgi
、cli
、fpm
和phpdbg
这几种模式: 更多模式详解请参考
- 但是要说具体用的是那种模式,我想还得看一下
nginx
才行,为什么呢?因为 nignx 作为服务器它不会解析.php
文件,它需要解析器才可以,而我们要看nginx
交给了谁来解析。查看homestead
里面 nginx 的配置命令:
通过 nginx 配置文件,查找对应的 PHP 模式
- 获取
nginx
的配置文件:
# 必须使用 sudo ,不然会报错
sudo nginx -t
- 执行结果如下:
- 打开
/etc/nginx/nginx.conf
文件:
vim /etc/nginx/nginx.conf
- 截取部分内容如下:
...
http {
...
# 其他文件的引入
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
- 我们发现
nignx.conf
文件本身还引用了其他的配置文件,尤其看这个include /etc/nginx/sites-enabled/*
目录,执行命令:
ll /etc/nginx/sites-enabled
- 我们看到是一些
link
软连接文件:
- 真正的项目
nginx
配置文件是这个:/etc/nginx/sites-available/dcat-config.test
,查看它:
vim /etc/nginx/sites-available/dcat-config.test
- 我们找到有关
.php
文件是如何处理的:
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
}
nginx
执行到有.php
文件时,它会通过fastcgi
协议将内容传递给fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
,也就说php8.0-fpm.sock
socket 套接字文件接收了nignx
传递过来的信息。具体什么是 php8.0-fpm.sock,详情可参考同样也可以说明,从浏览器发送过来的请求是通过php-fpm
模式下接收了信息并执行的。所以此时 PHP 使用的模式是fpm
模式,那么它的php.ini
文件也要在这个模式下获取。
获取 fpm 文件夹下的配置文件
- 列出
fpm
文件夹,我们终于找到了它php.ini
文件:
ll /etc/php/8.0/fpm
- 执行结果如下:
- 但是
xdebug
的相关配置文件没在php.ini
文件,它在/etc/php/8.0/fpm/conf.d
文件夹下,执行命令:
ls /etc/php/8.0/fpm/conf.d
- 至此,我们终于找到了它
20-xdebug.ini
文件,接下来我们配置它。
配置 Xdebug 扩展
修改配置文件内容如下:
zend_extension=xdebug.so
xdebug.mode = debug
xdebug.discover_client_host = true
xdebug.client_port = 9005
xdebug.max_nesting_level = 512
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.idekey = PHPSTORM
xdebug.remote_autostart=1
xdebug.client_host=192.168.56.1
xdebug.remote_handler=dbgp
xdebug.start_with_request=yes
保存修改,并重启 php-fpm
- 执行命令(根据自己的 php-fpm 版本号,自行重启):
sudo service php8.0-fpm restart
- 输出
phpinfo()
查看 php 的配置信息,确定已经加载成功了:
配置 PhpStorm 编辑器
点击配置 PhpStorm 的 Debug 编辑配置选项
- 如图所示:
- 点击进入页面,内容如下:
- 点击左边加号,新增一个PHP Remote Debug项目,然后填写好下面的几个选项。
步骤说明:
- 第 3 步:Name 名字随便取就行。
- 第 4 步:勾选上。
- 第 5 步:最重要的是 IDE key 要填写
PHPSTORM
,这个和刚才xdebug.ini
里设置的xdebug.idekey = PHPSTORM
是对应的。 - 第 6 步:点击
...
三个点按钮,新增服务。
新增 Servers 项目:
- 点击
...
三个点按钮进入页面如下:
步骤说明:
- 第 2 步:Name 名字取为 homestead 是因为服务用的就是这个开发环境。
- 第 3 步:使用项目对应的本地 host 配置的域名。
- 第 4 步:默认 80 端口。
- 第 5 步:使用
Xdebug
调试扩展。 - 第 6 步:使用路径映射,这里指的是主机项目文件和虚拟机项目文件的映射。
- 第 7 步:
dcat-config
项目的虚拟机绝对路径是/home/vagrant/Code/learn-github/dcat-config
。
新增完 Service 并保存配置:
- 保存方式如下:
打开 PhpStorm 的偏好设置 Command + ,
并对 PHP CLI 进行设置
- 打开 PHP 的配置:
- 点击新增 CLI Interpreters,并选择
From Docker,Vagrant,VM,WSL,Reote
这个选项:
- 选择
Vagrant
实例Homestead
所在的目录:
- 然后点击确定:
- 然后点击 PHP 偏好设置选项,找到 Debug 这个配置项,配置 Debug Port 为:9005。
注意划重点了:这个端口之所以用 9005,而不是其他如(9000,9003)是因为我试过它不行(也许是端口占用了),改为 9005 是可以的!!! - 配置完然后验证
validate
第五步全是对号 ✅ 就没问题了。 - 注意:其中
Path to create validation script
的路径一定要到public
下
- 到此为止,PhpStorm 就和 homestead 虚拟机链接上了。
配置浏览器
安装 Xdebug helper 插件:
插件下载连接(需要梯子):
https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc
下载完后,谷歌浏览器扩展列表会有一个小虫子的图标如下所示:
- 不过我发现,在我 PhpStorm2021.3.3 版本,好像不需要这个插件也能打断点的。
开启调试
步骤如下:
- 第 1 步:在代码中打断点。
- 第 2 步:在浏览器访问
dcat-config.test
host 域名。 - 第 3 步:PhpStorm 自动弹出,断点的打印信息,在这里可以看到任何你想看变量的值。
结语
- 到此
xdebug
的配置和调试的方法已经讲完了,内容看起来很多,原因是图片很多,主要是为了讲清楚。但是总体上就四大步。- 配置
xdebug.ini
信息。 - 配置
PhpStorm
编辑器。 - 配置
Goggle Chrome
浏览器。 - 打断点,并刷新页面触发断点。
- 配置
- 很麻烦,但是很值得。你终于不再惧怕太多未知的问题了,因为
xdebug
调试工具可以帮你完成。 - 有了这个调试工具,那些扩展包代码以及框架底层的代码的执行流程将一览无余,你在框架的理解上也会比别人快很多,这也是你进步的阶梯,所以,何乐而不为呢?
参考连接:
- Laravel开发系列三:PHPStorm+Homestead+XDebug3调试
- xdebug-phpstrom Waiting for incoming connection with ide key xxxx问题说明
- Homestead 下关于 PhpStorm Xdebug 断点调试工具的安装
- 折腾 HomeStead 配置xdebug
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: