• 欢迎来到我的博客
  • [email protected]

PHP 实时输出

学习笔记 tianlan 2周前 (03-28) 47次浏览 0个评论 扫描二维码
文章目录[隐藏]
很多浏览器不会实时输出,必须要等数据传输完毕或已传输数据达到一定大小才会输出。

基础知识

PHP 输出缓冲区

Nginx

以下代码我在本地(phpstudy+php7.3+nginx1.15)测试有效,但是在服务器(宝塔+php+nginx1.16)上面测试无效。

切换过两个php版本(5.6和7.2)均无效,猜测是 nginx 方面的问题,不过 nginx 并没有使用 proxy_ignore_headers来忽略X-Accel-Buffering,具体原因不明。

//通知 nginx 关闭 proxy_buffering, 当然你要确保你的nginx中没有使用proxy_ignore_headers来忽略X-Accel-Buffering
header('X-Accel-Buffering: no');

//开启 output_buffering
ob_start();

for ($i = 0; $i < 5; $i++) {
    echo $i;

    //填满 nginx fastcgi_buffer 需要参考 nginx 配置文件中的 fastcgi_buffer_size
    echo str_repeat('-',1024*64);
    echo '<br>';
    
    //推送 output_buffering 内容
    ob_flush();

    //nginx 只能将数据推送到 fastcgi_buffer
    //不过上面把 fastcgi_buffer 填满了,所以会继续向上推送到浏览器(代码开始关闭了 proxy_buffering)
    flush();
    sleep(1);
}

//关闭 output_buffering
ob_end_flush();

Apache

//开启 output_buffering
ob_start();
for ($i = 0; $i < 5; $i++) {
    echo $i;
    echo '<br>';
    ob_flush(); //推送 output_buffering 内容
    flush(); //直接推送到浏览器
    sleep(1);
}
//关闭 output_buffering
ob_end_flush();

天蓝, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP 实时输出
喜欢 (0)
[[email protected]]
分享 (0)

您必须 登录 才能发表评论!