Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

文章目录

前言

曾经我的调试方式:

也许很多小伙伴都和我有相同的经历,假如程序需要排查问题时,默认方式是 echoprint_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
  • 进入后,像这一样:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

看一下 Homestead.yaml 文件下,我的项目使用的那个 PHP 版本:

  • 打开 Homestead.yaml 文件, code 是我配置 vscode 编辑器的快捷命令:
cd ~/Homestead && code .
  • 查看对应项目使用的 PHP 版本为:8.0,其实我这个项目是指定了 PHP 版本,不指定的话使用默认的 PHP 版本。

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

获取 php.ini 文件

我们知道,要想使用 PHP 的扩展,必须先下载并安装它,最终生成 xxxxx.so 扩展文件,然后在 php.ini 文件中引用这个扩展。这样输出的 phpinfo() 内容会并显示对应的扩展信息。但是 homestead 环境已实现帮我们下载好对应的扩展了,我们只需找到 php.ini 配置文件并正确引用它就可以了。

  • 查看命令行的 PHP 的版本:
php -v
  • 版本号如下:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 如果版本号不是你项目对应项目的版本号,您可以通过以下命令切换:
# 切换到 8.0
php80
# 切换到 7.4
php74
...
  • 您可以通过在虚拟机命令行中输入 php 在加上 tab 键,可以看到支持的所有 php 命令:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 正常情况下我们通过这种方式查看 php 的配置文件地址:
php --ini
  • 但是我发现,命令行输出好多配置文件信息,而且这些配置文件路径都有一个很明显的特征,这些文件都在 /etc/php/8.0/cli 文件夹下:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 但是这个路径是不行的,因为 /etc/php/8.0/cli 下的配置文件是作用于 cli 模式(命令行模式)下执行文件的配置。而不是通过浏览器访问域名,经过 nginx 服务器转发到 php 执行文件的配置。然后我就想看一下是否有其他模式,我罗列 cli 目录的上一级目录 /etc/php/8.0
ll /etc/php/8.0

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 但是要说具体用的是那种模式,我想还得看一下 nginx 才行,为什么呢?因为 nignx 作为服务器它不会解析 .php 文件,它需要解析器才可以,而我们要看 nginx 交给了谁来解析。查看 homestead 里面 nginx 的配置命令:

通过 nginx 配置文件,查找对应的 PHP 模式

  • 获取 nginx 的配置文件:
# 必须使用 sudo ,不然会报错 
sudo nginx -t
  • 执行结果如下:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 打开 /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 软连接文件:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 真正的项目 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
  • 执行结果如下:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 但是 xdebug 的相关配置文件没在 php.ini 文件,它在 /etc/php/8.0/fpm/conf.d 文件夹下,执行命令:
ls /etc/php/8.0/fpm/conf.d
  • 至此,我们终于找到了它 20-xdebug.ini 文件,接下来我们配置它。

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

配置 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
xdebug.remote_autostart=1

保存修改,并重启 php-fpm

  • 执行命令(根据自己的 php-fpm 版本号,自行重启):
sudo service php8.0-fpm restart
  • 输出 phpinfo() 查看 php 的配置信息,确定已经加载成功了:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

配置 PhpStorm 编辑器

点击配置 PhpStorm 的 Debug 编辑配置选项

  • 如图所示:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 点击进入页面,内容如下:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 点击左边加号,新增一个PHP Remote Debug项目,然后填写好下面的几个选项。

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

步骤说明:

  • 第 3 步:Name 名字随便取就行。
  • 第 4 步:勾选上。
  • 第 5 步:最重要的是 IDE key 要填写 PHPSTORM,这个和刚才 xdebug.ini 里设置的xdebug.idekey = PHPSTORM 是对应的。
  • 第 6 步:点击 ... 三个点按钮,新增服务。

新增 Servers 项目:

  • 点击 ... 三个点按钮进入页面如下:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

步骤说明:

  • 第 2 步:Name 名字取为 homestead 是因为服务用的就是这个开发环境。
  • 第 3 步:使用项目对应的本地 host 配置的域名。
  • 第 4 步:默认 80 端口。
  • 第 5 步:使用 Xdebug 调试扩展。
  • 第 6 步:使用路径映射,这里指的是主机项目文件和虚拟机项目文件的映射。
  • 第 7 步:dcat-config 项目的虚拟机绝对路径是 /home/vagrant/Code/learn-github/dcat-config

新增完 Service 并保存配置:

  • 保存方式如下:
    Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

打开 PhpStorm 的偏好设置 Command + , 并对 PHP CLI 进行设置

  • 打开 PHP 的配置:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 点击新增 CLI Interpreters,并选择 From Docker,Vagrant,VM,WSL,Reote 这个选项:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 选择 Vagrant 实例 Homestead 所在的目录:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 然后点击确定:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 然后点击 PHP 偏好设置选项,找到 Debug 这个配置项,配置 Debug Port 为:9005。注意划重点了:这个端口之所以用 9005,而不是其他如(9000,9003)是因为我试过它不行(也许是端口占用了),改为 9005 是可以的!!!
  • 配置完然后验证 validate 第五步全是对号 ✅ 就没问题了。
  • 注意:其中 Path to create validation script 的路径一定要到 public

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 到此为止,PhpStorm 就和 homestead 虚拟机链接上了。

配置浏览器

安装 Xdebug helper 插件:

  • 插件下载连接(需要梯子):

    https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc
  • 下载完后,谷歌浏览器扩展列表会有一个小虫子的图标如下所示:

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

  • 不过我发现,在我 PhpStorm2021.3.3 版本,好像不需要这个插件也能打断点的。

开启调试

Xdebug3 断点调试环境之 - Laravel8 + PHP8 + Xdebug3 + PhpStorm2021.3 + Homestead v13.2.1 + Mac

步骤如下:

  • 第 1 步:在代码中打断点。
  • 第 2 步:在浏览器访问 dcat-config.test host 域名。
  • 第 3 步:PhpStorm 自动弹出,断点的打印信息,在这里可以看到任何你想看变量的值。

结语

  • 到此 xdebug 的配置和调试的方法已经讲完了,内容看起来很多,原因是图片很多,主要是为了讲清楚。但是总体上就四大步。
    • 配置 xdebug.ini 信息。
    • 配置 PhpStorm 编辑器。
    • 配置 Goggle Chrome 浏览器。
    • 打断点,并刷新页面触发断点。
  • 很麻烦,但是很值得。你终于不再惧怕太多未知的问题了,因为 xdebug 调试工具可以帮你完成。
  • 有了这个调试工具,那些扩展包代码以及框架底层的代码的执行流程将一览无余,你在框架的理解上也会比别人快很多,这也是你进步的阶梯,所以,何乐而不为呢?

参考连接:

本作品采用《CC 协议》,转载必须注明作者和本文链接
Xiao Peng
本帖由 MArtian 于 3周前 加精
laravel_peng
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7

打破零回复

6天前 评论
laravel_peng (楼主) 6天前

我的是 WSL2 没有配置成功,难受 :sob:

6天前 评论
laravel_peng (楼主) 6天前

xdebug 只适用于本地环境,因为国内网络大多都没有独立IP,如果是远程环境(服务器)就会受阻,所以我还是要使用苦逼的 dd

6天前 评论
laravel_peng (楼主) 6天前

感谢分享,解决问题的思路不错,不过有些地方还可以深入。

6天前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
技术员 @ 北之海信息科技有限公司
文章
9
粉丝
7
喜欢
69
收藏
107
排名:945
访问:4774
私信
所有博文