【问题标题】:PHP 5 second countdown (CLI, not JavaScript)PHP 5 秒倒计时(CLI,不是 JavaScript)
【发布时间】:2011-08-04 01:34:21
【问题描述】:

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

【问题讨论】:

  • 提示确认而不是等待不是更好吗?如果这个人跑了它然后看向别处几秒钟怎么办?
  • 这是一个系统级功能,它会执行可能具有破坏性的功能吗?
  • 这不会回答你的问题,但是当我打开你的问题的那一刻,“最后的倒计时”开始在我正在收听的这个网络电台上播放。 youtube.com/watch?v=9jK-NcRmVcw
  • 作为@jnpcl 的替代方案,如果没有给出某个选项,我会停止并打印一条消息,例如--force.
  • @DarkDust:我会用它作为额外的保护措施,当然不是单独使用。

标签: php command-line-interface


【解决方案1】:

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

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

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

【讨论】:

  • 这是个好主意(也很有趣)。您介意详细说明如何在 PHP 脚本中实际实现这一点吗?
  • +1 获取详细、易于理解且非常有趣的答案。如果可以的话,我会 +3。
【解决方案2】:

你应该可以使用睡眠

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

【讨论】:

  • 当脚本仍在运行时,Web 服务器不一定会将其刷新到浏览器。
  • @ceejayoz 是的,尽管在这种情况下提问者说它正在运行 CLI。
【解决方案3】:

即使我 1000% 同意 jnpcl 的评论,即要求确认而不是显示倒计时,这里是 Windows 命令行上经过测试的解决方案(希望它适用于 *nix 系统):

<?php

echo "countdown:";

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

echo "0\nkaboom!";

【讨论】:

    【解决方案4】:

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

    <?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

    【讨论】:

      【解决方案5】:

      这就是我最终做的:

      # 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\n"; //clear last number (overwrite it with spaces)
      }
      

      通过使用\r(回车),您可以从行首开始并覆盖当前行的输出。

      【讨论】:

      • if 条件下,您的意思是在$response 周围放置strtolower() 而不是'y'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      相关资源
      最近更新 更多