xdebug.filename_format已被废弃,实际生效的是xdebug.profiler_output_name;xdebug 2.6+已移除该配置,仅支持xdebug.profiler_output_name及其占位符(如%p、%t、%r等),cli下%r和%s不可靠。

xdebug.filename_format 已被废弃,实际生效的是 xdebug.profiler_output_name —— 这是很多人在配置 Xdebug 性能分析时第一步就卡住的根本原因。
为什么找不到 xdebug.filename_format?
从 Xdebug 2.6 开始,xdebug.filename_format 就不再存在;官方文档和源码中均已移除。所有文件名控制逻辑统一收口到 xdebug.profiler_output_name。如果你在 php.ini 或 xdebug.ini 中写了这个配置项,它会被完全忽略,Xdebug 不报错也不警告,只会静默 fallback 到默认名 cachegrind.out.%p。
- 旧教程或迁移文档里残留的
xdebug.filename_format是过期信息 - Xdebug 3.x 完全不识别该指令,连 warning 都不输出
- 验证方式:执行
php --ri xdebug,检查输出里是否出现该配置项(不会出现)
真正可用的格式化占位符有哪些?
xdebug.profiler_output_name 支持一组固定占位符,用于动态生成 cachegrind 文件名。常见组合包括:
-
%p:进程 ID(最稳定,避免并发覆盖) -
%t:Unix 时间戳(秒级,适合按时间归档) -
%r:随机数(4 位十六进制,防冲突) -
%s:脚本 basename(不含路径,如index.php) -
%R:请求 ID(需配合xdebug.request_id_header或自动启用)
示例:xdebug.profiler_output_name = cachegrind.out.%s.%t.%r → 生成 cachegrind.out.index.php.1745734560.a3f1
容易踩的坑:%R 和 %s 在 CLI 下失效
这两个占位符依赖 SAPI 环境上下文:
Xdebug 3.4.1 是一款功能强大的 PHP 调试扩展工具,于 2025 年 1 月 6 日正式发布。作为 Xdebug 3.4 系列的首个修复版本,3.4.1 版在继承上一版本强大功能的同时,重点解决了稳定性问题。该版本不仅修复了访问超全局变量时可能引发的程序崩溃现象,还增强了对 Windows 平台 PIE 构建机制的支持,为广大 PHP 开发者提供了更加稳定的调试环境。这一版本适合所有
-
%R在 CLI 模式下始终为空字符串(除非手动设置$_SERVER['REQUEST_ID']) -
%s在 CLI 下取的是当前执行脚本名(如test.php),但若用php -r "..."则为-,导致文件名非法 -
%t.%r组合最稳妥:时间戳保证唯一性,随机数防秒级并发冲突
错误配置:xdebug.profiler_output_name = cachegrind.out.%R → 所有 CLI 请求都写入 cachegrind.out.(空名),最终只保留最后一个分析结果。
压缩与文件名不能共存?
Xdebug 本身不支持直接在 xdebug.profiler_output_name 中写 .gz 后缀来触发压缩。压缩由 xdebug.profiler_output_dir 的目录属性决定:
- Linux/macOS:若目标目录挂载为 zfs/btrfs 并启用透明压缩,文件自然被压
- Windows:NTFS 压缩需手动设置目录属性,Xdebug 不感知
- 真正可控的方式是后期用脚本批量 gzip:
find /tmp/profiles -name "cachegrind.out.*" -exec gzip {} \;
注意:xdebug.profiler_append = 1 会复用同一文件,此时 %r 或 %t 失效 —— 必须关掉它,否则多个请求混在一个文件里,WebGrind/KCacheGrind 解析失败。
真正要记住的只有两件事:删掉所有 xdebug.filename_format,改用 xdebug.profiler_output_name;别信 %R 在 CLI 下能工作,它大概率给你一个空字符串加一堆覆盖的文件。










