ProgressBar 输出似乎填充控制台输出
ProgressBar output appears to pad console output
我正在尝试将 Symfony 的控制台输出组件包含到现有的 non-Symfony 应用程序中,总体来说进展顺利。
我似乎仍然无法理解的一件事是,如果我使用 ProgressBar class,它似乎会用进度条的宽度填充我发送的所有输出。
以下是代码的粗略概述(删除了各种不必要的废话):
public function run() {
$this->logger = new \Symfony\Component\Console\Output\StreamOutput(fopen('php://stdout', 'w'));
$this->logger->setVerbosity(\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_DEBUG);
$this->progress = new \Symfony\Component\Console\Helper\ProgressBar($this->logger);
$this->progress->start();
$this->doStepOne();
$this->progress->finish();
}
public function doStepOne() {
$i = 1;
while($i < 10000000000) {
$this->info(sprintf('Sweet, done a thing on page #%d', $i));
}
}
public function info($message) {
$this->log(sprintf("<info>%s</info>", $message));
}
public function log($message) {
// This follows advice from http://symfony.com/doc/current/components/console/helpers/progressbar.html indicating that if you output content, you should ->clear() first and ->display() after.
// If I don't do this, then the progress bar is output on every line, immediately followed by $message
$this->progress->clear();
$this->logger->writeln($message);
$this->progress->advance();
$this->progress->display();
}
所以这一切看起来都很简单。同样,我没有在 Symfony 控制台输出中使用它,所以也许这就是原因,但它看起来很奇怪所以我想看看是否有其他人遇到过它。我无法使用我的 Google-fu 找到任何东西,但也许它很弱?
示例(忽略 ^C 字符,即 Ctrl-C 终止进程):
此外,为了消除任何混淆 - 第一个可见行 没有我添加的缩进 ,第二行有 一个 space 字符 我自己插入的缩进,对于任何混淆,我们深表歉意。
我也观察到这一点,使用 Symfony 2.7,使用 ConsoleOutput
流。我 "fixed" 的方式是手动将 ANSI delete-to-start 序列插入到输出中。修改您的代码,即:
if ($this->logger->isDecorated()) {
$this->logger->write("\x0D");
}
不漂亮。
截至 2.8,此行为仍然存在。我不确定这是不是错误。不过好像是。
我正在尝试将 Symfony 的控制台输出组件包含到现有的 non-Symfony 应用程序中,总体来说进展顺利。
我似乎仍然无法理解的一件事是,如果我使用 ProgressBar class,它似乎会用进度条的宽度填充我发送的所有输出。
以下是代码的粗略概述(删除了各种不必要的废话):
public function run() {
$this->logger = new \Symfony\Component\Console\Output\StreamOutput(fopen('php://stdout', 'w'));
$this->logger->setVerbosity(\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_DEBUG);
$this->progress = new \Symfony\Component\Console\Helper\ProgressBar($this->logger);
$this->progress->start();
$this->doStepOne();
$this->progress->finish();
}
public function doStepOne() {
$i = 1;
while($i < 10000000000) {
$this->info(sprintf('Sweet, done a thing on page #%d', $i));
}
}
public function info($message) {
$this->log(sprintf("<info>%s</info>", $message));
}
public function log($message) {
// This follows advice from http://symfony.com/doc/current/components/console/helpers/progressbar.html indicating that if you output content, you should ->clear() first and ->display() after.
// If I don't do this, then the progress bar is output on every line, immediately followed by $message
$this->progress->clear();
$this->logger->writeln($message);
$this->progress->advance();
$this->progress->display();
}
所以这一切看起来都很简单。同样,我没有在 Symfony 控制台输出中使用它,所以也许这就是原因,但它看起来很奇怪所以我想看看是否有其他人遇到过它。我无法使用我的 Google-fu 找到任何东西,但也许它很弱?
示例(忽略 ^C 字符,即 Ctrl-C 终止进程):
此外,为了消除任何混淆 - 第一个可见行 没有我添加的缩进 ,第二行有 一个 space 字符 我自己插入的缩进,对于任何混淆,我们深表歉意。
我也观察到这一点,使用 Symfony 2.7,使用 ConsoleOutput
流。我 "fixed" 的方式是手动将 ANSI delete-to-start 序列插入到输出中。修改您的代码,即:
if ($this->logger->isDecorated()) {
$this->logger->write("\x0D");
}
不漂亮。
截至 2.8,此行为仍然存在。我不确定这是不是错误。不过好像是。