使用 sleep() 函数作为带有 while 循环的计时器不起作用?

Posted

技术标签:

【中文标题】使用 sleep() 函数作为带有 while 循环的计时器不起作用?【英文标题】:Using sleep() function as timer with while loop is not working? 【发布时间】:2021-10-04 18:53:11 【问题描述】:

我想要一个 while 循环到 echo 每 5 秒 x 的值,直到 x 等于 10,但使用 sleep() 函数使其 echo 的所有 10 个值在循环结束,而不是每 5 秒一次。

$x = 1;
while($x <= 10) 
  sleep(5);
  echo $x;
  $x++;

如何在不使用 cron 的情况下解决此问题?

附:我需要通过 Web 服务器而不是控制台运行脚本。

【问题讨论】:

你是在控制台还是通过网络服务器运行这个脚本? @nikserg 网络服务器。 【参考方案1】:

这是预期的行为。 Web 服务器不会一出现就将输出发送给用户。当脚本完成时,输出将发送给用户,而不是更早。 sleep() 只是让脚本运行时间更长。 如果您需要制作一些动态显示线条的网页,则需要使用 javascript。这是前端任务,而不是后端。

【讨论】:

实际上我需要每 10 秒发送一次 curl 请求,这就是 sleep() 循环的目的。我认为通过 javascript 发送 http 请求是不可能的,所以我必须通过 php 来做到这一点。有什么建议吗?【参考方案2】:

您看到的是输出到达浏览器的延迟,而不是 PHP 代码的延迟。默认情况下,Web 服务器会“缓冲”输出,一次向浏览器发送一个块,而不是单独发送每个字节。

您可以更改它(使用flush()ob_flush),但这听起来并不是您真正想要实现的目标。为了让您的实验更清晰,请尝试在每个步骤中回显时间:

$x = 1;
while($x <= 10) 
  sleep(5);
  echo (new DateTime)->format('H:i:s'), "<br>\n';
  $x++;

尽管它们都同时到达您的浏览器,但您将能够看到该命令实际上是按照您的意愿展开的。

【讨论】:

感谢您的帮助。我想每 5 秒发出一次 curl 请求,仅供参考。

以上是关于使用 sleep() 函数作为带有 while 循环的计时器不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

实用技巧之while里面使用getchar或sleep函数

有没有办法修复 while 循环不使用 time.sleep 更新 tkinter 标签?

while循

如何在while循环中评估函数

循环链表

8.实现一个sleep函数