Symfony 命令中加进度条需使用 ProgressBar 类,传入 OutputInterface 和总步数,调用 start()、advance()、finish() 控制流程,支持自定义格式、预估时间、内存监控及 Laravel 封装写法。

Symfony 命令中加进度条,核心是用 ProgressBar 类配合终端输出流实时刷新。它不依赖前端或 HTTP,专为 CLI 场景设计,支持步进、预估时间、自定义格式和内存监控等实用功能。
初始化与基础使用
在命令的 execute() 方法里创建并驱动进度条:
- 传入
OutputInterface实例和总步数(如处理 500 条记录就填500) - 调用
->start()渲染初始状态 - 每完成一项任务调用
->advance(),自动更新显示 - 全部完成后调用
->finish()清理行并换行
示例代码:
$progressBar = new ProgressBar($output, count($items));
$progressBar->start();
foreach ($items as $item) {
$this->process($item); // 你的实际逻辑
$progressBar->advance();
}
$progressBar->finish();
自定义进度条样式
默认显示是简单百分比和 ASCII 进度块,但你可以用 setFormat() 换成更清晰的模板:
-
ProgressBar::FORMAT_VERBOSE:显示已用时间、剩余预估、当前速度 -
ProgressBar::FORMAT_QUIET:只显示百分比数字 - 也可传入自定义字符串,如
'%current%/%max% [%bar%] %percent:3s%% %elapsed:6s%s/%estimated:-6s%s'
设置方式:
$progressBar->setFormat(ProgressBar::FORMAT_VERBOSE);
// 或
$progressBar->setFormat(' ⏳ %current%/%max% [%bar%] %percent:3s%%');
高级功能:预估时间和资源监控
进度条能自动估算剩余时间,前提是步长相对均匀;你还可以手动注入额外信息:
- 调用
->display()强制刷新(适合非循环场景) - 用
->setMessage('正在压缩...')动态更新提示文字 - 结合
memory_get_usage()在格式中嵌入内存占用,例如:%memory:6s% MB - 启用速率统计:
$progressBar->setRedrawFrequency(10)表示每 10 步重绘一次,减少高频刷新开销
Laravel 中的简化写法(兼容 Symfony)
如果你用的是 Laravel,它封装了更简洁的语法,底层仍是 Symfony 的 ProgressBar:
-
$this->withProgressBar($items, fn($item) => $this->handle($item))—— 自动管理起止和步进 -
$bar = $this->output->createProgressBar(count($items))—— 手动控制时的等价写法
注意:Laravel 的 withProgressBar() 会自动处理异常中断,并在结束时输出空行,体验更稳妥。


















