【问题标题】:Update Command-line Output, i.e. for Progress更新命令行输出,即进度
【发布时间】:2011-07-13 00:36:17
【问题描述】:

我希望能够在命令行的简单 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

【问题讨论】:

  • 通常php在任何东西发送到浏览器之前就已经完成了它的工作,脚本在做什么?
  • @Dagon 他正在使用命令行
  • 哇!谢谢,听起来更奇怪,然后我做的唯一 php 命令行是为我做的,它几乎不适合 user 界面。
  • 是的,它在命令行上。它只是用于简单的脚本,供个人使用:更新项目版本号,将文件传输到某处等。没有面向用户的
  • 真正的男人不需要漂亮的进度条:-)

标签: php command-line stdout autoflush


【解决方案1】:

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

在 PHP 中,当在该页面上指示 ESC 时,您将使用 "\033"


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

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
}


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

但是,当然,如果需要,您应该能够做更复杂的事情;-)

还有许多其他有趣的转义序列:例如,颜色可以大大增强您的输出;-)

【讨论】:

【解决方案2】:

只是为了记录一个旧线程: 我没有使用花哨的 ANSI Escape 序列将光标移回,而是使用“\r”将其移回行首,而不是下一行的开头“\n”。在您的回声之后添加几个空格以覆盖以前存在的任何内容,例如所以:

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

【讨论】:

  • 像魅力一样工作,也在 Windows 上! (经过测试)
  • 比投票最多的解决方案容易得多 - 在 OSX 上完美运行。
  • 更好的解决方案
  • 也可以使用usleep进行大收藏
  • 你是个天才!在 Windows 命令行窗口中工作正常!
猜你喜欢
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多