Progressbar组件显示在Symfony中的多行上

时间:2015-04-17 14:53:42

标签: php symfony progress-bar command-line-interface

我在Symfony2(2.6.6)的简单命令任务中使用progressbar component

我的代码是这样的:

...
$progress = new ProgressBar($output, $total);
$progress->start();

if (($handler = fopen($file, "r")) !== FALSE) {
    while (($row = fgetcsv($handler, 1000, ",")) !== FALSE) {
        $this->whatever();
        $progress->advance();
    }
    fclose($handler);
    $progress->finish();
}
...

输出如下:

  0/50 [>---------------------------]   0%
  5/50 [==>-------------------------]  10%
 10/50 [=====>----------------------]  20%
 15/50 [========>-------------------]  30%
 20/50 [===========>----------------]  40%
 25/50 [==============>-------------]  50%
 30/50 [================>-----------]  60%
 35/50 [===================>--------]  70%
 40/50 [======================>-----]  80%
 45/50 [=========================>--]  90%
 50/50 [============================] 100

进度条没有重新加载,显示在每个->advance()的新行中。我确信函数->whatever();对输出没有任何作用。

任何人都知道为什么会这样做?谢谢你!

抱歉我的英文

3 个答案:

答案 0 :(得分:4)

初始化进度条时可以使用setOverwrite()

$progress = new ProgressBar($output, $total);
$progress->setOverwrite(true);

$progress->start();
...

这定义了是否覆盖进度条,或创建新的直线。http://api.symfony.com/3.0/Symfony/Component/Console/Helper/ProgressBar.html#method_setOverwrite

答案 1 :(得分:0)

您宁愿使用SymfonyStyle(sf> = 2.7)类,因为现在不推荐使用Console Helper。

这是一个虚拟的例子:

protected function execute(InputInterface $input, OutputInterface $output)
{
    $console = new SymfonyStyle($input, $output);
    $console->title('Dummy progressBar example');
    $console->progressStart(100);
    for ($i = 0; $i < 100; $i++) {
        // do something
        sleep(1);
        $console->progressAdvance();
    }
    $console->progressFinish(); // force progress
    $console->success('Dummy progressBar example complete!');
}

答案 2 :(得分:-1)

您可以尝试$ output-&gt; setDecorated(true);