Xdebug 3 的 profile 分析需同时满足 xdebug.mode=profile 和 xdebug.start_with_request=trigger,二者缺一不可:mode 控制功能许可(开门),start_with_request=trigger 启用触发机制(配钥匙),仅设 mode 不会响应 XDEBUG_PROFILE 等信号。

Xdebug 3 的 trigger 模式必须同时设 xdebug.mode=profile 和 xdebug.start_with_request=trigger,缺一不可。否则 Web 请求根本不会生成 cachegrind 文件。
为什么加了 XDEBUG_PROFILE 参数还是没生成分析文件?
常见错误是只配了 xdebug.mode=profile,但漏了 xdebug.start_with_request=trigger。Xdebug 3 默认不响应任何触发参数,必须显式启用“按需启动”逻辑。
-
xdebug.mode控制功能开关,profile表示允许性能分析,但不等于“自动开” -
xdebug.start_with_request控制何时真正启动,trigger表示只在检测到触发信号时才激活 - 两者是“门禁+钥匙”的关系:门开着(mode=profile),但没钥匙(start_with_request≠trigger)也进不去
怎么传 trigger 信号?三种可靠方式
不是所有传参方式都有效,尤其要注意 Xdebug 3 对 Cookie/GET/POST 的识别差异:
- 浏览器地址栏加
?XDEBUG_PROFILE=1—— 最简单,但注意 URL 编码问题(比如值含特殊字符要 urlencode) - 用 Postman 或 curl 发送请求头:
X-XDEBUG-PROFILE: 1(Xdebug 3 支持该 header,比 GET 更干净) - 设置 Cookie:
XDEBUG_PROFILE=1—— 必须确保 Cookie 被实际发送(浏览器插件如 Xdebug Helper 可自动注入,但要确认它当前处于 Profile 模式)
不推荐用 xdebug.profiler_enable_trigger_value(Xdebug 2 遗留配置),Xdebug 3 已废弃该参数,设了也无效。
Xdebug 3.4.1 是一款功能强大的 PHP 调试扩展工具,于 2025 年 1 月 6 日正式发布。作为 Xdebug 3.4 系列的首个修复版本,3.4.1 版在继承上一版本强大功能的同时,重点解决了稳定性问题。该版本不仅修复了访问超全局变量时可能引发的程序崩溃现象,还增强了对 Windows 平台 PIE 构建机制的支持,为广大 PHP 开发者提供了更加稳定的调试环境。这一版本适合所有
输出目录权限和文件名格式容易被忽略
即使 trigger 成功,文件也可能写失败或无法识别:
-
xdebug.output_dir目录必须存在且 PHP 进程有写权限(常见坑:/var/tmp/xdebug目录不存在,或 SELinux/ACL 限制) - 文件名必须以
cachegrind.out.开头,否则qcachegrind或 PhpStorm 不认(xdebug.profiler_output_name=cachegrind.out.%t.%p是安全选择) - 如果用
%u(用户 ID)或%s(脚本名)等格式符,确保对应值合法(比如脚本名含斜杠会导致路径截断)
验证 trigger 是否真生效的最快方法
别等打开 qcachegrind——直接看日志和文件系统:
- 临时加
xdebug.log=/tmp/xdebug.log,触发请求后检查日志里有没有profiler started字样 - 用
ls -lt /your/output/dir/看是否有新生成的cachegrind.out.*文件(注意时间戳是否匹配请求时刻) - 用
php --ri xdebug | grep -E "(mode|start_with_request|output_dir)"确认运行时配置确实是你要的值(不是 php.ini 里写了但没加载)
最常卡住的地方其实是 CLI 和 Web 使用的 php.ini 不一致,php --ini 和 phpinfo() 输出的配置路径必须对得上。


















