Следующее относится к машинам Unix .
Цель состоит в том, чтобы получить текущие итоговые столбцы терминала. (используя tput
)
Это база, готовая к расширению.
#!/usr/bin/php
<?php
@ob_start();
$shell = system("tput cols");
@ob_end_clean();
for( $i= 0 ; $i < $shell ; $i++ ){ echo "█"; usleep(100000); }

Действия ob
здесь, чтобы скрыть stdout
из tput
.
Допустим, вы хотите, чтобы индикатор выполнения соответствовал прогрессу вашей задачи.
Просто разделите оставшееся время в секундах на количество столбцов.
Вы можете получить микросекунды, поэтому лучше использовать usleep
.
Таким образом, индикатор выполнения всегда будет соответствовать ширине пользовательской оболочки, в том числе при изменении размера.
Чтобы сделать то же самое в чистом bash:
for ((i=0; i<$(tput cols); i++)); do echo -e "█\c" ;done
Это показывает главную особенность php echo
: он не добавляет новую строку, в то время как bash echo
делает.
При использовании циклов, скажем, для проверки условия в интервалах,
Еще один приятный способ предупредить о текущей активности - текстовые эффекты .
Следующее использование strtoupper
и код ANSI обратное видео .
#!/usr/bin/php
<?php
$iloop = "0"; /* Outside the loop */
while (true){
$warn = "Program running hold on!!\r";
if (strlen($warn) === $iloop+1){
$iloop = "0";
}
$warn = str_split($warn);
$iloop++;
$warn[$iloop] = "\033[35;2m\e[0m".strtoupper($warn[$iloop]);
echo " \033[7m".implode($warn);
usleep(90000);
}
Выход:

Некоторым может понравиться версия для вечеринки, полученная путем итерации кодов ANSI.
#!/usr/bin/php
<?php
$iloop = "0"; /* Outside the loop */
while (true){
for ($i=0;$i<=109;$i++){
$warn = "Program running hold on!!\r";
if (strlen($warn) === $iloop+1){
$iloop = "0";
}
$warn = str_split($warn);
$iloop++;
$warn[$iloop] = "\033[$i;7m".strtoupper($warn[$iloop]);
echo " \033[7m".implode($warn);
usleep(90000);
}}

Подробнее о ANSI кодах: https://stackoverflow.com/a/48365998/2494754