Обновление вывода командной строки, то есть для прогресса

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

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

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

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

Спасибо

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

Ответ 1

Это можно сделать, используя ANSI Escape Sequences - см. здесь для списка.

В 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-последовательностей: цвета, например, могут немного улучшить ваш выход; -)

Ответ 2

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

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