如何在共享Linux主机上禁用PHP中的输出缓冲?

时间:2016-04-06 20:12:51

标签: php .htaccess shared-hosting output-buffering

我刚刚将我的网站移动到GoDaddy托管,并且一切正常,但PHP脚本没有立即输出数据 - 它们会一直缓存,直到脚本运行完毕,然后渲染整个页面一次。显然,对于长脚本来说,这是一个问题。我以前没有和我的老主人那样运行,GoDaddy的支持说他们无法帮助解决这个问题。这是我已经尝试过的(没有任何成功)

  1. 禁用输出压缩(zlib,gzip)
  2. 在php.ini
  3. 中设置output_buffering = off
  4. Cache-Control "max-age=0, no-cache, no-store, must-revalidate"Pragma "no-cache"Expires "Wed, 10 May 1985 09:00:00 GMT"设置标头,并取消设置ETag标题
  5. 我还尝试使用ini_set('output_buffering', 'off')ini_set('zlib.output_compression', false)while (@ob_end_flush())ini_set('implicit_flush', true)ob_implicit_flush(true)
  6. 在脚本中设置缓冲值
  7. 我尝试在每次flush()输出后运行ob_flush()echo命令
  8. 尝试将PHP版本从默认值(5.4原生,已启用APC)更改为5.4非本机和5.5
  9. 我还创建了一个测试脚本,它只循环5次迭代并在每次迭代时输出一行,然后在下一次迭代之前等待一秒。我这样做是为了消除任何其他可能的问题原因。但无论我做什么,脚本总是等待它开始渲染之前完成。

    那么,我能做些什么来让它正常工作吗?

1 个答案:

答案 0 :(得分:0)

首先要注意的是,如果您成功禁用所有缓冲,您将制作较短的脚本much slower.此外,逐步将HTML刷新到浏览器不会自动导致内容在浏览器中呈现;您可能已成功绕过缓冲服务器端,但发现它仍在浏览器中缓冲。尝试使用数据包嗅探器监控流量,以确定是否是这种情况。可以使用分块编码逐步呈现内容,但是很简单。

正如您所知,缓冲通常会发生在PHP和Web服务器之间的接口中,可以通过以下方式刷新:

while(ob_get_level()) {
   ob_end_flush(); 
}
flush();

正确刷新内容对性能有很大影响。如果从早期冲洗中获得好处,那么它通常就在头部...... /头部之后。

为了有效地压缩内容,大多数网络服务器将缓冲数据。你不会说你正在使用的是什么网络服务器,但是如果它的Apache 2.x那么你可以通过deflateBufferSize指令减少这个缓冲区的大小(以匹配刷新之前的块的大小)(更有效完全禁用缓冲)。

如果是Apache,请确保已启用Keepalive。

如果您和服务器之间还有其他代理,那么您可以使用HTTP做的事情不多,但它们不会影响HTTPS流量。

最后,如果您在客户端上使用反病毒产品,这可能是导致许多问题的原因 - 许多中断浏览器和网络之间的网络连接。他们经常在他们的工作质量方面留下很多不足之处。

在一天结束时,当您不控制基础设施时,您所做的事情是有限的。但是除了分块编码/渐进式渲染之外还有其他解决方案。