如何防止nginx在PHP中缓冲?

时间:2016-04-12 12:58:17

标签: php nginx

我正在尝试将页面推送到浏览器,同时从PHP脚本生成页面。我无法访问我的托管服务提供商的nginx配置,但他们告诉我他们使用的是nginx 1.8.1。在我的phpinfo()输出中,我可以看到

output_buffering    0   0

并且相同的脚本在我的本地PC上按预期工作。

这是我的开始脚本:

<pre>
<?php
for ($i = 0; $i < 100; ++$i) {
  print('<b>.</b>');
  flush();
  usleep(100000); // 0.1 second
}
?>
</pre>

我立即开始在我的本地电脑上获得输出,但是当我从托管中访问该页面时,我必须等待整整10秒才能看到任何内容。

这些是默认的响应标头:

  

HTTP / 1.1 200 OK
  服务器:nginx
  日期:2016年4月12日星期二12:32:05 GMT
  内容类型:text / html;字符集= UTF-8
  连接:保持活力
  变化:接受编码
  X-Powered-By:PHP / 5.4.45
  内容编码:gzip

如果我添加

<?php
header('X-Accel-Buffering: no');

我得到了

  

HTTP / 1.1 200 OK
  服务器:nginx
  日期:2016年4月12日星期二12:35:10 GMT
  内容类型:text / html;字符集= UTF-8
  连接:保持活力
  变化:接受编码
  X-Powered-By:PHP / 5.4.45
  内容编码:gzip

<?php
header('X-Accel-Buffering: no');
header('Content-Encoding: identity');
  

HTTP / 1.1 200 OK
  服务器:nginx
  日期:2016年4月12日星期二12:37:11 GMT
  内容类型:text / html;字符集= UTF-8
  内容长度:812
  连接:保持活力
  X-Powered-By:PHP / 5.4.45
  内容编码:身份

显然,如果服务器知道内容的长度,它就等待脚本完成,然后再开始将其发送到浏览器。

这些是我本地计算机上的标题:

  

HTTP / 1.1 200 OK
  日期:2016年4月12日星期二12:52:31 GMT
  服务器:Apache / 2.4.7(Win32)PHP / 5.4.45 OpenSSL / 1.0.1e
  X-Powered-By:PHP / 5.4.45
  X-Accel-Buffering:没有   内容编码:身份
  保持活跃:超时= 5,最大= 100
  连接:保持活力
  内容类型:text / html; charset = utf-8

X-Accel-Buffering标头被传递,因为我没有在本地运行nginx。

我是否可以通过PHP传递任何其他标头来阻止nginx缓冲内容?到目前为止,我只找到了配置选项,我无权访问。

0 个答案:

没有答案