PHP Flush,工作...甚至在Nginx

2022-08-30 14:58:46

是否可以在每次执行循环时进行回显?例如:

foreach(range(1,9) as $n){
    echo $n."\n";
    sleep(1);
}

我希望看到它每次打印每个结果,而不是在循环完成后打印所有内容。


答案 1

消除nginx缓冲的最简单方法是发出一个标头:

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

这消除了和(如果你有nginx>= 1.5.6)。。如果您使用的是php-fpm,fastcgi位至关重要。根据需要执行标头也更加方便。proxy_bufferingfastcgi_buffering

有关 X-Accel-Buffering 文档的文档 fastcgi_buffering


答案 2

最终解决方案

这就是我发现的:

Flush在Apache的mod_gzip或Nginx的gzip下不起作用,因为从逻辑上讲,它是gzip内容,要做到这一点,它必须缓冲内容以gzip它。任何类型的Web服务器gzipping都会影响这一点。简而言之,在服务器端,我们需要禁用gzip并减小fastcgi缓冲区大小。所以:

  • 在 php.ini 中:

    .output_buffering = 关

    .zlib.output_compression = 关

  • 在nginx.conf中:

    .gzip off;

    .proxy_buffering关闭;

手头也有这行,特别是如果你没有访问php.ini:

  • @ini_set(“zlib.output_compression”,0);

  • @ini_set('implicit_flush',1);

  • @ob_end_clean();

  • set_time_limit(0);

最后,如果你有它,请在下面设置代码:

  • ob_start(“ob_gzhandler”);

  • ob_flush();

PHP 测试代码:

ob_implicit_flush(1);

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

    //this is for the buffer achieve the minimum size in order to flush data
    echo str_repeat(' ',1024*64);

    sleep(1);
}

相关:


推荐