Symfony / Console:如何使用多个进度条?

时间:2017-04-15 09:50:02

标签: php symfony guzzle symfony-console

我有一个Symfony / Console命令,可以使用Guzzle Pool一次下载多个文件。我已经让Guzzle报告了每个文件的download progress,这很好。

现在我想使用Symfony / Console中的ProgressBar helper来改进它。问题是我为ProgressBar找到的所有示例都只使用一个进度条。我需要几个独立的进度条 - 每个下载一个。你能给我一些提示如何实现这个目标吗?

3 个答案:

答案 0 :(得分:8)

我在这里找到了一些东西:[Console] A better progress bar #10356

use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Output\ConsoleOutput;

$output = new ConsoleOutput();

$bar1 = new ProgressBar($output, 10);
$bar2 = new ProgressBar($output, 20);
$bar2->setProgressCharacter('#');
$bar1->start();
print "\n";
$bar2->start();

for ($i = 1; $i <= 20; $i++) {
    // up one line
    $output->write("\033[1A");
    usleep(100000);
    if ($i <= 10) {
        $bar1->advance();
    }
    print "\n";
    $bar2->advance();
}

效果:

ProgressBar

在更新栏之前,您必须将控制台光标移动到相应的行(向上和向下)。但它的确有效。我证实了。

答案 1 :(得分:2)

使用Symfony 4.1无需手动光标控制即可支持此功能,请参见 https://symfony.com/doc/current/components/console/helpers/progressbar.html#console-multiple-progress-bars

$section1 = $output->section();
$section2 = $output->section();

$progress1 = new ProgressBar($section1);
$progress2 = new ProgressBar($section2);

$progress1->start(100);
$progress2->start(100);

$i = 0;
while (++$i < 100) {
    $progress1->advance();

    if ($i % 2 === 0) {
         $progress2->advance(4);
    }

    usleep(50000);
}

答案 2 :(得分:0)

Laravel 5.6 / Linux

use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Output\ConsoleOutput;

$output = new ConsoleOutput();

$bar1 = new ProgressBar($output->section(), 10);
$bar2 = new ProgressBar($output->section(), 20);
$bar2->setProgressCharacter('#');
$bar1->start();
print "\n";
$bar2->start();

for ($i = 1; $i <= 20; $i++) {
    // up one line
    $output->write("\033[1A");
    usleep(100000);
    if ($i <= 10) {
        $bar1->advance();
    }
    print "\n";
    $bar2->advance();
}