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
(возврат каретки) вы можете начать с начала строки и перезаписать вывод в текущей строке.