PHP 5秒倒计时(CLI,不是JavaScript)

时间:2011-04-12 16:37:09

标签: php command-line-interface

我正在编写一个PHP CLI(命令行)脚本,如果它是偶然运行的话会造成一些不可逆转的损坏。我想在继续执行脚本之前显示5秒倒数计时器。我怎么能用PHP做到这一点?

5 个答案:

答案 0 :(得分:13)

不要倒计时。这假设某人实际上正在观看屏幕并阅读/理解倒计时的含义。完全有可能有人走进来,坐在桌子的边缘,然后按下键入脚本名称并让它在后面转动时运行。

相反,使用一些荒谬的命令行参数来启用破坏性模式:

$ 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;

答案 1 :(得分:4)

你应该可以使用睡眠

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";

答案 2 :(得分:4)

即使我1000%同意jnpcl的评论声明要求确认而不是显示倒计时,这是Windows命令行上的测试解决方案(希望它可以在* nix系统上运行):

<?php

echo "countdown:";

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

echo "0\nkaboom!";

答案 3 :(得分:3)

要添加我的两分钱,以下是添加确认提示的方法。

<?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来获得乐趣。请参阅this tutorial

答案 4 :(得分:1)

这就是我最终做的事情:

# 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(回车),您可以从行的开头开始并覆盖当前行的输出。