Laravel Artisan 命令行:命令行进度条
问题
可以在 Artisan 命令中设置进度条么?
回答
对于耗时任务,有进度条提示,用户体验会好很多。
下面,我们创建一个演示进度条基本用法的 demo:processbar
命令,源码如下:
Artisan::command('demo:processbar {--custom}', function ($custom) {
$bar = $this->output->createProgressBar(10);
if ($custom) {
$bar->setBarCharacter('<comment>=</comment>');
$bar->setEmptyBarCharacter(' ');
$bar->setProgressCharacter('|');
$bar->setBarWidth(50);
}
$i = 0;
do {
sleep(1);
$bar->advance();
} while (++$i < 10);
$bar->finish();
});
首先,我们用 output
对象创建一个进度条对象,创建的同时指定进度条的总步长。
$bar = $this->output->createProgressBar(10);
然后,可以对进度条进行定制,比如上面的命令在指定 --custom
选项后,会进行下列定制:
设置进度条已完成部分的字符(黄色 =
号):
$bar->setBarCharacter('<comment>=</comment>');
设置进度条未完成部分字符(空格字符):
$bar->setEmptyBarCharacter(' ');
设置进度指示字符:
$bar->setProgressCharacter('|');
设置进度条宽度:
$bar->setBarWidth(50);
更多定制项,请见 Symfony 进度条组件文档。
然后,在命令执行过程中,更新进度条进度:
$bar->advance();
最后,任务执行完毕后,设置进度条完结。
$bar->finish();
效果: