Обновить вывод из командной строки, т.е. для Progress - PullRequest
56 голосов
/ 10 марта 2011

Я хотел бы иметь возможность отображать индикатор прогресса в простом PHP-скрипте в командной строке. Вместо того, чтобы видеть

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

Я бы хотел, чтобы просто изменился номер и заменил предыдущий номер, так же, как это делает git clone, например, Resolving deltas: 100% (8522/8522), done..

Во время поиска я нашел тот же вопрос, на который ответили в Perl , и это прекрасно, но я не смог найти его в PHP. Является ли это возможным? Если нет, я прибегну к C.

Спасибо

Обновление: Если кому-то интересна версия C ++, она здесь .

Ответы [ 2 ]

100 голосов
/ 10 марта 2011

Это можно сделать с помощью ANSI Escape-последовательности - , смотрите список .

В 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
}


Я немного упростил, убедившись, что у меня всегда 5лишние символы и всегда отображающие одно и то же количество данных, чтобы всегда перемещаться назад на одно и то же количество символов ...

Но, конечно, вы должны быть в состоянии сделать гораздо более сложным, если это необходимо; -)

И есть много других интересных escape-последовательностей: например, цвета могут немного улучшить ваш вывод; -)

52 голосов
/ 13 ноября 2016

Просто для записи, хотя старый поток: Вместо того чтобы использовать причудливую последовательность ANSI Escape для перемещения курсора назад, я просто перемещаю его обратно в начало строки, используя «\ r» вместо начала следующей строки «\ n». Добавьте несколько пробелов после эха, чтобы перезаписать все, что было ранее, например, например. так:

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