我希望我正在开发的网页的页面内容在下载时显示在屏幕上。在我的测试/开发环境中,使用 PHP flush() 命令可以按预期工作。
但是,我的生产设置 (WPEngine) 在 Apache 前面使用了一个 Nginx 代理,并且 flush() 不再有效(也没有任何其他输出缓冲命令)。当我想通过发送 4k 的空白来刷新时,我已经能够通过故意填充缓冲区来获得所需的行为。
但是,这感觉像是一个 hack,并且有问题的页面需要刷新 100 次或更多次,因此这对下载的数据总量增加了相当大的数量。
有没有办法通过发送控制字符和/或设置 HTTP header 来通知 Nginx 刷新缓冲区(或根本不刷新缓冲区),这样我就可以避免发送不必要的空格?
由于 WPEngine 是托管环境,我无法对服务器设置进行任何更改。因此,例如,通过向 nginx 服务器配置添加指令来关闭 Nginx 缓冲不是一种选择。
我目前这样做的方式如下:-
<?php
//turn off server content compression for this page
header('Content-Encoding: none;');
//turn off PHP output buffering
ob_end_flush();
//make padding to fill buffer
$buffer = str_repeat(" ", 4096*8);
$start = time();
do
{
printf( 'Time: %s secs<br>', time() - $start );
echo $buffer;
sleep(1);
} while( (time() - $start) < 10 );
?>
最佳答案
虽然已经有一个被接受的答案在一定程度上是正确的,但值得注意的是,如果您使用的是 php-fpm,fastcgi_buffering
也是一个问题。
文档不清楚,但在您的响应中发出 X-Accel-Buffering: no
header 将禁用 fastcgi_buffering
,仅在 >= nginx 1.5 中。 6强>。 header 实际上似乎同时影响 proxy_buffering
和 fastcgi_buffering
,这 isn't clear from the docs .
由于大多数发行版仍在运行 nginx 1.4 系列,并且很多人都在使用 php-fpm,这是一个潜在的触发点(即它让我挂了一个小时)。
关于php - 在 Apache/Nginx 设置中刷新输出缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20018803/