php - 在 Apache/Nginx 设置中刷新输出缓冲区

标签 php nginx output-buffering

我希望我正在开发的网页的页面内容在下载时显示在屏幕上。在我的测试/开发环境中,使用 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_bufferingfastcgi_buffering,这 isn't clear from the docs .

由于大多数发行版仍在运行 nginx 1.4 系列,并且很多人都在使用 php-fpm,这是一个潜在的触发点(即它让我挂了一个小时)。

关于php - 在 Apache/Nginx 设置中刷新输出缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20018803/

相关文章:

php - 为什么 PHP 中的日期时间到时间戳转换不起作用?

php - 不存在的表不会引发错误

javascript - Ajax:多次提交后防止刷新页面

mysql - 您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展。在 Ubuntu 14.04 LTS 上

python - Google App Engine 在 Python/Flask API 上产生 502 错误

.net - nginx 负载均衡器和长连接 - 目标总是相同吗?

php - 输出缓冲不显示错误通知

php - 使用 PHPUnit 测试 PHP header

java - 延迟播放音频

php - 我们如何将存储为 varchar 的日期转换为日期