Я нашел этот классный индикатор выполнения, который я использую:
https://stackoverflow.com/a/27147177/1480397
Но я понятия не имею, что он делает, и я не могу его погуглить.
"\r\033[0G\033[2K[%'={$percentageDone}s>%-{$percetageLeft}s] - $percentageDone%% - $absoluteDone/$absoluteTotal - avg %.4f - %s",
Это то, что я использую.
Я думаю, что последовательности:
\r
— возврат каретки, вернуться на старт\033[0G
— Esc[0g
Очистить вкладку в текущем столбце` *\033[2K
— Esc[2K
Очистить всю строку *[%'={$percentageDone}s>%-{$percetageLeft}s]
*
Это не делает то, что я ожидаю, когда я удаляю код, Source: http://ascii-table.com/ansi-escape-sequences-vt-100.php
Итак, правильно ли извлечены эти последовательности? Правильна ли интерпретация? И почему последние пишут классные бары?
[====> <much more spaces> ]
Код для тестирования:
for ($i = 0; $i <= 100; $i++) {
$absoluteDone = $i;
$absoluteTotal = 100;
$percentageDone = floor(($absoluteDone / $absoluteTotal) * 100);
$percetageLeft = 100 - $percentageDone;
$avgTime = 10;
$setCursorToLineStart = "\033[0G";
$clearLine = "\033[2K";
$progressbarAndStatusInfo = sprintf(
$setCursorToLineStart
. $clearLine
. "[%'={$percentageDone}s>%-{$percetageLeft}s] - $percentageDone%% - $absoluteDone/$absoluteTotal - avg %.4f - %s",
"",
"",
$avgTime,
gmdate("H:i:s", $avgTime * ($absoluteTotal - $absoluteDone))
);
echo $progressbarAndStatusInfo;
sleep(1);
}
Однако коды возврата ANSI выглядят корректно:
[%'={$percentageDone}s>%-{$percetageLeft}s]
не имеет ничего общего с ANSI. Это заполнение через sprintf:
'={$percentageDone}
заполнит строку символами x ‘=’, где x — это значение в $ процентном выражении.
Увидеть Sprintf документы для деталей.
Других решений пока нет …