Update Command-line Output, i.e. for Progress

2019-01-12 18:00发布

I'd like to be able to show a progress meter in a simple PHP script on the command line. Instead of seeing

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

I'd like just the number to change, and replace the previous number, much like git clone does for example Resolving deltas: 100% (8522/8522), done..

While searching for this I found the same question answered in Perl, which is perfect, but I couldn't find it in PHP. Is it possible? If not, I'll resort to C.

Thanks

Update: If anyone's interested in the C++ version, it's here.

3条回答
我欲成王,谁敢阻挡
2楼-- · 2019-01-12 18:43

Just for the record though an old thread: Instead of using fancy ANSI Escape sequencing to move the curser back I just move it back to the beginning of the line using "\r" instead of to the beginning of the next line "\n". Add a few spaces after your echo to overwrite anything that was there previously, like e.g. so:

for ($i=0 ; $i<=100 ; $i++) {
  echo "Progress: $i %   \r";
  sleep(1);
}
查看更多
在下西门庆
3楼-- · 2019-01-12 18:54

Also you can do something like this:

<?php

function showTextBasedProgress()
{
   static $progress = '-';

   echo chr(8) . $progress; // chr(8) = \b

   switch ($progress)
   {
      case '-':
      {
         $progress = '\\';
         break;
      }

      case '\\':
      {
         $progress = '|';
         break;
      }

      case '|':
      {
         $progress = '/';
         break;
      }

      case '/':
      {
         $progress = '-';
         break;
      }
   }
}

Example usage:

while(1)
{
   showTextBasedProgress();
   sleep(1);
}
查看更多
Evening l夕情丶
4楼-- · 2019-01-12 19:03

This can be done using ANSI Escape Sequences -- see here for a list.

In PHP, you'll use "\033" when it's indicated ESC on that page.


In your case, you could use something like this :

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
}


I simplified a bit, making sure I always have 5 extra characters, and always displaying the same amount of data, to always move backwards by the same number of chars...

But, of course, you should be able to do much more complicated, if needed ;-)

And there are many other interesting escape sequences : colors, for instance, can enhance your output quite a bit ;-)

查看更多
登录 后发表回答