更新命令行输出,即进度

时间:2011-03-10 20:07:27

标签: php command-line stdout autoflush

我希望能够在命令行上用简单的PHP脚本显示进度表。而不是看

Progress: 0%
Progress: 1%
etc...

我只想更改数字,并替换之前的数字,就像git clone那样,例如Resolving deltas: 100% (8522/8522), done.

在搜索时我找到了same question answered in Perl,这是完美的,但我在PHP中找不到它。可能吗?如果没有,我会求助于C.

由于

更新:如果有人对C ++版本it's here感兴趣。

2 个答案:

答案 0 :(得分:98)

这可以使用 ANSI Escape序列 - see here来完成。

在PHP中,当"\033"在该页面上显示ESC时,您将使用echo "Progress : "; // 5 characters of padding at the end for ($i=0 ; $i<=100 ; $i++) { echo "\033[5D"; // Move 5 characters backward echo str_pad($i, 3, ' ', STR_PAD_LEFT) . " %"; // Output is always 5 characters long sleep(1); // wait for a while, so we see the animation }


在你的情况下,你可以使用这样的东西:

{{1}}


我简化了一点,确保我总是有5个额外的字符,并且始终显示相同数量的数据,以便始终向后移动相同数量的字符...

但是,当然,如果需要,你应该能够做得更复杂; - )

还有许多其他有趣的转义序列:例如,颜色可以提升你的输出相当多; - )

答案 1 :(得分:46)

只是为了记录旧线程: 而不是使用花哨的ANSI Escape排序来移动光标,我只需使用“\ r”而不是下一行“\ n”的开头将其移回行的开头。在echo之后添加一些空格来覆盖之前的任何空格,例如这样:

for ($i=0 ; $i<=100 ; $i++) {
  echo "Progress: $i %   \r";
  sleep(1);
}