张鹏22_981 发布于 2017-05-10 08:39

有如下代码:

for($i=1;$i<=10;$i++){
        echo json_encode(array('error'=>0,'msg'=>'这是测试的输出——'.$i));
        ob_flush();
        flush();
        sleep(1);
    }

按代码理解似乎应该是每过1秒钟,将输出一次json数据
而使用nginx作为web服务器时,会发现上面的代码,在程序运行10s后一次性输出了
php.ini中的output_buffering = 4096
后来又按网上说的尝试使用了ob_end_clean(); ob_implicit_flush(true);这些函数,但还是没有效果

5 个回答
  • 在输出前先输出一个nginx特定的header:

    header('X-Accel-Buffering: no');

    这样无需设置什么gzip啊,缓存大小啊什么的
    官方文档

    2017-05-10 14:27 回答
  • flush();
    ob_flush();
    
    2017-05-10 19:11 回答
  • WAMP下:

    for($i=1;$i<=10;$i++){
            echo str_pad(' ', 4096);
            echo json_encode(array('error'=>0,'msg'=>'这是测试的输出——'.$i));
            ob_flush();
            flush();
            sleep(1);
        }
    

    我试了试,这样是可以的。
    http://segmentfault.com/q/1010000000447596

    Ngnix下:
    关闭php.ini下的:zlib.output_compression = Off
    关闭nginx.conf下的:gzip off
    修改代码为echo str_pad(' ', 64000);

    2017-05-11 04:49 回答
  • function  test(){
        header("Content-Encoding: none\r\n");
        ini_set('zlib.output_compression', 'off');
        ob_start();
        for($i=0;$i<100;$i++){
            echo str_repeat(" ",4096);
            echo $i."<br>";
            ob_flush();
            flush();
            sleep(1);
        }
    }
    
    2017-05-10 14:04 回答
  • 经测试,楼上回答正确。 完美解决了nginx下无法flush的问题

    2017-05-10 18:51 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
活跃用户
  • 1
    问道摩托
  • 2
    袁广龙976丶
  • 3
    逍遥子
  • 4
    亮仔
  • 5
    芙蓉花
  • 6
    作小die_syj
  • 7
    王丽珠景平怡伦_621
  • 8
    adfa3sd5f6a
  • 9
    欣欣大妮
  • 10
    sfasfs
PHP1.CN | 中国最专业的PHP中文社区 | PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | PHP问答
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有