Symfony ProgressBar输出显示为pad控制台输出

Symfony ProgressBar输出显示为pad控制台输出,symfony,symfony-console,Symfony,Symfony Console,我正在尝试将Symfony的控制台输出组件包含到现有的非Symfony应用程序中,总体来说,它运行得非常好 有一件事似乎仍然让我无法理解,那就是如果我使用ProgressBar类,它似乎会按照进度条的宽度填充我发送的所有输出 下面是代码的大致概述(去掉了各种不必要的污点): 公共函数运行(){ $this->logger=new\Symfony\Component\Console\Output\StreamOutput(fopen('php://stdout","w"),; $this->log

我正在尝试将Symfony的控制台输出组件包含到现有的非Symfony应用程序中,总体来说,它运行得非常好

有一件事似乎仍然让我无法理解,那就是如果我使用ProgressBar类,它似乎会按照进度条的宽度填充我发送的所有输出

下面是代码的大致概述(去掉了各种不必要的污点):

公共函数运行(){
$this->logger=new\Symfony\Component\Console\Output\StreamOutput(fopen('php://stdout","w"),;
$this->logger->setVerbosity(\Symfony\Component\Console\Output\OutputInterface::VERBOSITY\u DEBUG);
$this->progress=new\Symfony\Component\Console\Helper\ProgressBar($this->logger);
$this->progress->start();
$this->doStepOne();
$this->progress->finish();
}
公共函数doStepOne(){
$i=1;
而($i<1000000000){
$this->info(sprintf('Sweet,在第#%d页上做了一件事,$i));
}
}
公共功能信息($message){
$this->log(sprintf(“%s”,$message));
}
公共函数日志($message){
//这是根据http://symfony.com/doc/current/components/console/helpers/progressbar.html 指示如果输出内容,应首先->清除(),然后->显示()。
//如果我不这样做,那么每行都会输出进度条,紧接着是$message
$this->progress->clear();
$this->logger->writeln($message);
$this->progress->advance();
$this->progress->display();
}
所以这一切看起来都很简单。同样,我没有在Symfony控制台输出中使用它,所以这可能就是原因,但它看起来很奇怪,所以我想我会看看是否有其他人遇到过它。我用我的Google fu找不到任何东西,但也许它很弱

示例(忽略^C字符,即终止进程的Ctrl-C): 另外,为了消除混淆,第一行没有我添加的缩进,第二行有一个我自己插入的缩进空格字符,很抱歉出现混淆。

我也观察到了这一点,使用Symfony 2.7,使用
控制台输出
流。我“修复”它的方法是在输出中手动插入ANSI delete to start序列。修改您的代码,这将是:

if ($this->logger->isDecorated()) {
    $this->logger->write("\x0D");
}
不漂亮


截至2.8,此行为仍然存在。我不确定这是不是一个bug。不过,似乎是这样。

谢谢@bishop,这对我来说很管用,但看起来确实有点问题,或者没有得到很好的解释,因为这似乎很常见。将你的回答标记为答案。
if ($this->logger->isDecorated()) {
    $this->logger->write("\x0D");
}