我刚刚将我的网站移动到GoDaddy托管,并且一切正常,但PHP脚本没有立即输出数据 - 它们会一直缓存,直到脚本运行完毕,然后渲染整个页面一次。显然,对于长脚本来说,这是一个问题。我以前没有和我的老主人那样运行,GoDaddy的支持说他们无法帮助解决这个问题。这是我已经尝试过的(没有任何成功)
output_buffering = off
Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
,Pragma "no-cache"
,Expires "Wed, 10 May 1985 09:00:00 GMT"
设置标头,并取消设置ETag
标题ini_set('output_buffering', 'off')
,ini_set('zlib.output_compression', false)
,while (@ob_end_flush())
,ini_set('implicit_flush', true)
和ob_implicit_flush(true)
flush()
输出后运行ob_flush()
和echo
命令我还创建了一个测试脚本,它只循环5次迭代并在每次迭代时输出一行,然后在下一次迭代之前等待一秒。我这样做是为了消除任何其他可能的问题原因。但无论我做什么,脚本总是等待它开始渲染之前完成。
那么,我能做些什么来让它正常工作吗?
答案 0 :(得分:0)
首先要注意的是,如果您成功禁用所有缓冲,您将制作较短的脚本much slower.此外,逐步将HTML刷新到浏览器不会自动导致内容在浏览器中呈现;您可能已成功绕过缓冲服务器端,但发现它仍在浏览器中缓冲。尝试使用数据包嗅探器监控流量,以确定是否是这种情况。可以使用分块编码逐步呈现内容,但是很简单。
正如您所知,缓冲通常会发生在PHP和Web服务器之间的接口中,可以通过以下方式刷新:
while(ob_get_level()) {
ob_end_flush();
}
flush();
正确刷新内容对性能有很大影响。如果从早期冲洗中获得好处,那么它通常就在头部...... /头部之后。
为了有效地压缩内容,大多数网络服务器将缓冲数据。你不会说你正在使用的是什么网络服务器,但是如果它的Apache 2.x那么你可以通过deflateBufferSize指令减少这个缓冲区的大小(以匹配刷新之前的块的大小)(更有效完全禁用缓冲)。
如果是Apache,请确保已启用Keepalive。
如果您和服务器之间还有其他代理,那么您可以使用HTTP做的事情不多,但它们不会影响HTTPS流量。
最后,如果您在客户端上使用反病毒产品,这可能是导致许多问题的原因 - 许多中断浏览器和网络之间的网络连接。他们经常在他们的工作质量方面留下很多不足之处。
在一天结束时,当您不控制基础设施时,您所做的事情是有限的。但是除了分块编码/渐进式渲染之外还有其他解决方案。