ob_flush()
将 PHP 的输出缓冲区内容强制发送给浏览器,但不关闭缓冲区,配合 flush() 一起使用时可以让内容实时“推送”。
注意:为了保证输出真正到达浏览器,通常要搭配 flush() 使用,而且服务器端和浏览器端均不能禁用缓存和压缩。
<?php
// 关闭脚本执行时间限制(根据需要)
// set_time_limit(0);
// 开启输出缓冲
ob_start();
// 禁用浏览器缓存和压缩,确保数据即时传输
header("Content-Type: text/plain");
header("Cache-Control: no-cache");
header("X-Accel-Buffering: no"); // 对于 Nginx 的禁用缓存
// 关闭 gzip 压缩(若服务器默认开启)
// 具体方法根据服务器环境配置
for ($i = 1; $i <= 5; $i++) {
echo "当前步骤:{$i}\n";
// 强制刷新 PHP 输出缓冲区
ob_flush();
flush();
// 使用 time_nanosleep 进行微秒级延迟,0.5秒 = 500,000,000 纳秒
time_nanosleep(0, 500000000);
}
echo "所有步骤完成!\n";
?>
ob_start():启动输出缓冲,确保可以控制缓冲刷新。
echo:逐条输出信息。
ob_flush() + flush():强制将缓冲区内容发送给客户端,刷新浏览器显示。
time_nanosleep(0, 500000000):暂停 0.5 秒(500,000,000 纳秒),使输出效果更加明显,模拟实时过程。
适当设置 HTTP 头,避免浏览器和服务器缓存导致内容滞后。
服务器配置影响
服务器(如 Apache、Nginx)默认可能启用输出压缩或缓冲,这会影响实时输出效果。确保关闭 gzip 压缩和加速缓存。
浏览器行为
有些浏览器会积累内容直到达到一定大小才渲染,输出内容过少时可能不会立即显示。可以尝试输出一定数量的空白字符以触发渲染。
缓冲区大小
PHP 的输出缓冲区和 Web 服务器缓冲区大小都会影响输出速度。可根据实际情况调整缓冲区大小。
PHP 版本
time_nanosleep 从 PHP 5.0.0 开始支持,确保你的环境符合要求。
通过结合 time_nanosleep 和 ob_flush(),我们可以在 PHP 中实现逐步、分段的实时数据输出,增强用户对长时间运行脚本进度的感知。这种方法简单易用,适合对延迟有微秒级需求的场景。
若配合合理的服务器和浏览器设置,可以获得非常流畅的实时输出效果,提升用户体验。