使用 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 循环的计时器不起作用?的主要内容,如果未能解决你的问题,请参考以下文章