要让 laravel 项目真正用好 xdebug 3.x,关键是确保请求来源可识别、编辑器连接正常、断点精准触发;需严格匹配 php 架构与 xdebug 版本,正确配置 zend_extension、xdebug.mode、client_host/port、idekey 及路径映射,并按 web/artisan/queue/graphql 场景差异化启用调试。

要让 Laravel 项目真正用好 Xdebug 3.x,关键不是装上就完事,而是让调试器精准“认得清”请求来源、“连得上”你的编辑器、“停得住”你想看的逻辑点。Xdebug 3 的配置逻辑更清晰,但路径映射、启动策略和 CLI/FPM 差异这些细节一旦错位,断点就灰掉、监听无响应、调试直接失联。
确认 Xdebug 3 已加载且版本匹配
装错版本是静默失败的主因。PHP 架构(x86_64/arm64)、线程安全(TS/NTS)、PHP 主版本(8.2/8.3)必须与 Xdebug 二进制文件完全一致。
- 运行
php -v查看 PHP 版本及架构信息 - 执行
php --ini找到生效的 php.ini 路径 - 访问 xdebug.org/wizard,粘贴
php --version和php --ini输出,获取定制安装指令 - 安装后运行
php -m | grep xdebug,有输出即表示模块已加载;再访问phpinfo()页面确认 Xdebug 3.x 标题可见
精简有效的 php.ini 配置(Xdebug 3)
Xdebug 3 不再用 xdebug.remote_* 前缀,新参数语义明确,但漏掉任一关键项都会导致连接中断。
-
zend_extension=xdebug.so(macOS/Linux)或zend_extension=php_xdebug.dll(Windows),路径需绝对准确 -
xdebug.mode=debug—— 必须显式启用 debug 模式 -
xdebug.start_with_request=yes—— 让所有 HTTP 请求自动触发调试(适合 Web 调试) -
xdebug.client_host=127.0.0.1—— 若在 Docker 或 Homestead 中,改为宿主机 IP(如192.168.10.1)或host.docker.internal -
xdebug.client_port=9003—— Xdebug 3 默认端口,VS Code / PHPStorm 均需对齐此值 -
xdebug.idekey=VSCODE或PHPSTORM—— 明确告知 IDE 类型,避免监听混淆
VS Code 或 PHPStorm 的路径映射必须真实对应
断点变灰色?90% 是路径映射没对上。Xdebug 报告的文件路径(如 /var/www/html/app/Http/Controllers/UserController.php)必须能一对一映射到你本地项目的真实路径(如 /Users/me/project/app/Http/Controllers/UserController.php)。
-
VS Code:在
.vscode/launch.json中设置pathMappings,例如:"pathMappings": { "/var/www/html": "${workspaceFolder}" } -
PHPStorm:进入 Preferences → PHP → Servers,添加服务器后勾选 “Use path mappings”,左侧填 URL 路径(如
http://localhost:8000),右侧填本地绝对路径 - 若用 Laravel Sail/Docker,容器内路径通常为
/var/www/html,本地路径为项目根目录,务必一一对应
按场景触发调试:Web、Artisan、Queue 全覆盖
Laravel 不同入口的调试方式不同,不能只靠浏览器访问自动触发。
-
Web 请求(API/页面):确保
xdebug.start_with_request=yes,启动 IDE 监听,直接访问http://localhost:8000/xxx即可断点命中 -
Artisan 命令:VS Code 中新增 launch 配置,
type: "php"+request: "launch",runtimeArgs包含"artisan", "your:command",IDE 会直接运行 CLI 进程并接管调试 -
队列任务:运行
php artisan queue:work时,该命令本身也是 CLI 进程,同样适用上述 Artisan 配置;断点打在handle()方法内即可暂停 -
GraphQL(Lighthouse):与普通 API 一致,Postman 发送请求时加
XDEBUG_SESSION_START=1Header,或使用浏览器插件一键开启











