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 .
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ść; -)
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);
}
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);
}
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