如何用PHP循环和sleep方法实现逐秒输出的倒计时功能?
问题产生原因
- PHP输出缓冲默认开启:PHP默认会将输出内容暂存到内存缓冲区,只有缓冲区满、脚本执行完毕或者手动触发 flush 操作时,才会将内容发送给客户端,不会每次echo就立即发送。
- 服务端Web服务器缓冲:Apache、Nginx等Web服务器默认也会开启输出缓冲,会收集到足够大小的响应内容后才会向浏览器传输,避免频繁小包传输带来的性能损耗。
- 浏览器端渲染阈值:多数浏览器存在最小渲染字节阈值,通常为1-4KB,收到的内容小于这个阈值时会暂时缓存不渲染,直到内容足够才会展示。
调整方案
需要手动关闭PHP层的输出缓冲,每次输出后主动刷出缓冲区,同时填充足够的空白内容绕过浏览器的渲染阈值,修改后的代码如下:
<?php // 关闭当前已开启的所有输出缓冲层 while (ob_get_level()) { ob_end_clean(); } // 开启隐式刷出,每次输出后自动执行flush操作 ob_implicit_flush(true); $myarr = [1,2,3,4,5,6,7,8,9,10]; foreach ($myarr as $p) { echo "{$p}<br/>"; // 输出4KB空白字符,绕过浏览器最小渲染阈值 echo str_repeat(' ', 4096); sleep(1); } ?>
补充说明
如果是在CLI命令行场景下运行该脚本,PHP默认关闭了输出缓冲,原始代码无需修改即可正常逐秒输出内容,仅通过Web服务器访问的场景需要做上述调整。如果调整后依然存在批量输出的问题,可以检查Web服务器是否开启了gzip压缩、代理缓冲这类会缓存响应内容的配置,关闭对应配置即可。
内容的提问来源于stack exchange,提问作者user16612111
相关产品推荐
相关产品推荐

