Update Command-line Output, czyli Dla Progress

Chciałbym móc pokazać miernik postępu w prostym skrypcie PHP w wierszu poleceń. Zamiast widzieć

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

Chciałbym tylko zmienić numer i zastąpić poprzedni numer, tak jak robi to na przykład git clone Resolving deltas: 100% (8522/8522), done..

Szukając tego znalazłem odpowiedź na to samo pytanie w Perlu , który jest idealny, ale nie mogłem go znaleźć w PHP. Czy to możliwe? Jeśli nie, ucieknę się do C.

Dzięki

Update: Jeśli ktoś zainteresowanych wersją C++, jest tutaj .

Author: Community, 2011-03-10

3 answers

Można to zrobić za pomocą sekwencji Escape ANSI -- zobacz tutaj dla listy.

W PHP, będziesz używać "\033", gdy jest to wskazane ESC na tej stronie.


W Twoim przypadku przydałoby się coś takiego:

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
}


Trochę uprościłem, upewniając się, że zawsze mam 5 dodatkowych znaków i zawsze wyświetlam tę samą ilość danych, aby zawsze poruszać się do tyłu o tę samą liczbę znaków...

Ale, oczywiście, powinieneś być w stanie zrobić znacznie więcej skomplikowane, w razie potrzeby; -)

I jest wiele innych ciekawych sekwencji ucieczki : kolory, na przykład, mogą znacznie poprawić wydajność; -)

 91
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-10 20:19:37

Tak dla przypomnienia choć stary wątek: Zamiast używać fantazyjnego sekwencjonowania ANSI Escape, aby przesunąć kursor do tyłu, po prostu przesuwam go z powrotem na początek linii za pomocą "\r "zamiast na początek następnej linii"\n". Dodaj kilka spacji po echo, aby nadpisać wszystko, co było tam wcześniej, np. so:

for ($i=0 ; $i<=100 ; $i++) {
  echo "Progress: $i %   \r";
  sleep(1);
}
 34
Author: Dom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-13 09:31:44

Również możesz zrobić coś takiego:

<?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;
      }
   }
}

Przykładowe użycie:

while(1)
{
   showTextBasedProgress();
   sleep(1);
}
 -2
Author: Yousha Aleayoub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-17 12:02:59