2010-03-05 4 views
7

У меня есть скрипт php, который работает в CLI, и я хочу отобразить текущий процентный прогресс, поэтому мне было интересно, можно ли обновить STDOUT, чтобы отобразить новый процент.Поиск STDOUT в PHP

Когда я использую rewind() или fseek(), он просто выдает сообщение об ошибке.

+0

Приведенные ниже ответы отлично, но я хотел бы бросить альтернативный подход там: Держите его простым. Просто периодически выводите новую строку данных прогресса. Или напечатайте "." голец. Это не так круто, как обновление одной и той же строки снова и снова, но она простая, функциональная, совместимая и работает так же хорошо, как вывод вашего приложения будет консольным или передан в файл. –

ответ

7

Смотрите этот код:

<?php 
echo "1"; 
echo chr(8); 
echo "2"; 

Выход только 2, так как "Chr (8)" является символ для "Backspace".

Так что просто напечатайте количество символов, необходимое для возврата и распечатайте новый процент.

Печать «\ г» тоже работает на Linux и Windows, но не собирается сократить его на макинтош

Рабочий пример:

echo "Done: "; 
$string = ""; 
for($i = 0; $i < 100; ++$i) { 
    echo str_repeat(chr(8), strlen($string)); 
    $string = $i."%"; 
    echo $string; 
    sleep(1); 
} 
+0

Привет, этот ответ был прекрасен :) – instigator

+0

Он может работать с определенными эмуляциями 7/8 бит, но это грязное решение – symcbean

+1

«Беспорядочное» решение, которое работает на каждом Linux (bash, shell, ..) Windows и Mac Platform и не требует от вас создания ncurses (дополнительный модуль php, который может быть недоступен на вашем хосте) или что-то еще. Все больше, чем это было бы пустой тратой времени OPs, по крайней мере, в 95% случаев. – edorian

4

Выход \r, а затем сброс, чтобы вернуться в первый столбец текущей строки.

+1

В качестве альтернативы вы можете попробовать использовать ncurses для вывода вашей командной строки, который имеет функцию ncurses_move (,), которая позволит вам помещать вывод туда, где вы хотите, произвольно. – cazlab

-1

Запись на консоль/терминал удивительно сложна, если вы хотите двигаться назад в выходном растрове или делать что-то вроде добавления цветов - и поведение будет зависеть от типа используемой консоли/терминала. Давным-давно некоторые люди придумали идею создания абстрактного представления терминала и написания этого.

См. this article, чтобы узнать, как это сделать в PHP.

+0

Он уже сказал, что использует CLI. – cazlab

+1

@ cazlab: «CLI» не является терминальным типом. –