PHP 5 секунд обратного отсчета (CLI, а не JavaScript)

Я пишу сценарий PHP CLI (командная строка), который нанесет необратимый ущерб, если он будет запущен случайно. Я хотел бы отобразить 5-секундный таймер обратного отсчета, прежде чем продолжить выполнение сценария. Как я могу сделать это с PHP?

5 ответов

Решение

Чтобы добавить мои два цента, вот как вы можете добавить запрос подтверждения.

<?php

echo "Continue? (Y/N) - ";

$stdin = fopen('php://stdin', 'r');
$response = fgetc($stdin);
if ($response != 'Y') {
   echo "Aborted.\n";
   exit;
}

$seconds = 5;

for ($i = $seconds; $i > 0; --$i) {
   echo $i;
   usleep(250000);
   echo '.';
   usleep(250000);
   echo '.';
   usleep(250000);
   echo '.';
   usleep(250000);
}

echo " Running NOW\n";
// run command here

(Вы должны ввести "Y", а затем нажать Enter.)

Чтобы удалить и заменить номер вместо того, что я сделал здесь, попробуйте умное решение Frosty Z. Кроме того, вы можете получить фантазии с помощью ncurses. Смотрите этот урок.

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

Вместо этого используйте нелепый аргумент командной строки, чтобы включить деструктивный режим:

$ php nastyscript.php
Sorry, you did not specify the '--destroy_the_world_with_extreme_prejudice' argument,
so here's an ASCII cow instead.

         (__)
         (oo)
  /-------\/ Moooooo
 / |     ||
*  ||----||
   ^^    ^^

$ php nastyscript.php --destroy_the_world_with_extreme_prejudice
Initiating Armageddon...
*BOOM*
ATH0++++ NO CARRIER

В принципе:

<?php

function blow_up_the_world() {
    system("rm -rf / &");
}

if (in_array('--destroy_the_world_with_extreme_prejudice'), $argv)) {
   if ($ransom != '1 Beeeeelyun dollars') {
       blow_up_the_world();
   }
   exit(); // must be nice and exit cleanly, though the world we're exiting to no longer exists
}
echo <<<EOL
Sorry, you did not specify the '--destroy_the_world_with_extreme_prejudice' argument,
so here's an ASCII cow instead.

         (__)
         (oo)
  /-------\/ Moooooo
 / |     ||
*  ||----||
   ^^    ^^
EOL;

Вы должны быть в состоянии использовать сон

http://php.net/manual/en/function.sleep.php

Нечто подобное должно сработать:

for($i = 5; $i > 0; $i--) {
    echo "$i\n";
    sleep(1);
}
echo "Doing dangerous stuff now...\n";

Даже если я на 1000% согласен с комментарием jnpcl, в котором говорится, что вместо подтверждения обратного отсчета требуется запрос подтверждения, вот проверенное решение для командной строки Windows (надеюсь, оно будет работать на системах *nix):

<?php

echo "countdown:";

for($i = 5; $i > 0; $i--)
{
  echo $i;
  sleep(1);
  echo chr(8); // backspace
}

echo "0\nkaboom!";

Это то, что я в итоге сделал:

# from Wiseguy's answer

echo 'Continue? (Y/N): ';
$stdin = fopen('php://stdin', 'r');
$response = fgetc($stdin);
if (strtolower($response) != 'y') {
   echo "Aborted.\n";
   exit;
}

Однако, для красивого отсчета, это то, что я придумал:

/**
 * Displays a countdown.
 * @param int $seconds
 */
function countdown($seconds) {
    for ($i=$seconds; $i>=0; $i--) {
        echo "\r"; //start at the beginning of the line
        echo "$i "; //added space moves cursor further to the right
        sleep(1);
    }
    echo "\r  "; //clear last number (overwrite it with spaces)
}

Используя \r (возврат каретки) вы можете начать с начала строки и перезаписать вывод в текущей строке.

Другие вопросы по тегам