【问题标题】:Php: how to print each result after a second of delay [duplicate]Php:如何在一秒钟的延迟后打印每个结果[重复]
【发布时间】:2016-12-23 13:58:03
【问题描述】:

我想要类似的东西:

for($k=0;$k<20;$k++){
    echo $k;
}

输出:

0

睡一秒钟。

1

睡一秒钟。

2

睡一秒钟。

.

。 .

【问题讨论】:

  • 以^开头的话题。
  • 打印在哪里?命令行?浏览器?还有你为什么想要这个?
  • 在脚本完成执行之前,PHP 不会输出任何内容(到浏览器),所以如果您确实喜欢下面的答案建议,您必须等到它全部执行后才能输出任何内容。您可能想改用 JS。
  • 如果不提供更多细节,我们只能给您technically correct 答案,而不是您真正想要的答案。

标签: php loops for-loop


【解决方案1】:

如果您有兴趣让变量一个一个地出现在页面上,中间有第二个延迟,您将需要使用 JavaScript 而不是 PHP。如果您需要来自 PHP 的输入,请使用 Ajax。

PHP 有一个名为sleep() (http://php.net/manual/en/function.sleep.php) 的内置函数,它会导致代码延迟给定的秒数。但是,这不会具有您可能期望的行为,即回显一个变量,然后等待一秒钟,然后回显另一个。该脚本将只需要多几秒的时间来执行。

所以,例如:

for($k=0;$k<20;$k++){
    echo $k;
    sleep(1);
}

执行需要 20 秒,但页面仍只会加载一次。

【讨论】:

  • 似乎有一个忍者反对每个人。 Downvoter:解释你为什么投反对票
  • 其实sleep函数执行20秒后打印1到20个no一起。
  • 这样,他还是会得到同样的结果,但是时间长了,因为sleep是在服务器上执行的,执行完之后,整个结果都会发送给浏览器。您根本无法在 PHP 中执行此操作,您需要实现客户端。编辑:我在回答编辑后删除了我的反对票,因为它现在解释了这种行为。
  • lukegv 和 Mohit 是 100% 正确的。我误解了提问者的意图;我认为他只是需要在回声之间人为地延迟,而不是希望在每个回声之间有一个一秒的回声。答案已更新以反映这一点。
【解决方案2】:

我认为您正在寻找输出缓冲区:

for ($k = 0; $k < 20; $k++) {
    echo $k . '<br />';
    flush();
    ob_flush();
    sleep(1);
}

【讨论】:

    【解决方案3】:

    如果您打算在 CLI 中执行此操作,则需要使用 sleep,像这样

    for($k=0;$k<20;$k++){
        echo $k.'<br>Sleep for 1 second.';
        sleep(1);
    }
    

    但是,如果您打算在网络浏览器上执行此操作,那么 PHP 在服务器响应客户端之前在服务器上运行,因此您所有 20 秒都花在服务器上,浏览器将在以下位置接收所有输出一次。因此,对于浏览器,您的方法是不够的,取而代之的是,您可能想要进行轮询、setTimeout 或 setInterval。由于您对 PHP 循环感兴趣,我建议您可以从命令行运行 PHP。

    【讨论】:

      【解决方案4】:

      使用内置睡眠功能 //时间以秒为单位

      for($k=0;$k<20;$k++){
          echo $k;
          sleep(1);
      }
      

      【讨论】:

      • 投反对票的人:解释你投反对票的原因
      • 这样,他还是会得到同样的结果,但是时间长了,由于sleep是在服务器上执行的,执行完后,结果会发送给浏览器。你在PHP中根本无法做到这一点,你需要实现客户端。
      • 我不是在争论,是的,可以在浏览器上显示... php 不会这样做,但在 cli 中会
      • @lukegv 取决于上下文。如果在浏览器中尝试过,那么你是对的。但是由于这在 CLI 中有效,我是否可以建议我们应该要求回答者将该信息包含在答案中,而不是对正确的答案投反对票?
      【解决方案5】:

      来自http://docs.php.net/Thread 使用 pthreads

      <?php
      
      class workerThread extends Thread {
      public function __construct($i){
        $this->i=$i;
      }
      
      public function run(){
        while(true){
         echo $this->i;
         sleep(1);
        }
      }
      }
      
      for($i=0;$i<50;$i++){
      $workers[$i]=new workerThread($i);
      $workers[$i]->start();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-01
        相关资源
        最近更新 更多