跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

详解xdebug.filename_format性能分析文件名格式化

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 环境上下文:
%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 下能工作,它大概率给你一个空字符串加一堆覆盖的文件。

相关文章