Apache/PHP输出缓存

Apache/PHP输出缓存,php,apache,http,caching,Php,Apache,Http,Caching,我正在编写一个PHP脚本,它可以在不预先知道长度的情况下动态生成大的(多MB)输出。我直接写信给php://output通过fwrite()并尝试了标准输出和使用传输编码:chunked(根据需要对区块进行编码),但无论我尝试什么,浏览器都会等到所有数据写入后才显示下载对话框。我也尝试过在头和每个块之后使用flush()ing,但这也没有什么区别 我猜Apache正在缓存输出,就像浏览器从服务器收到几kB数据后通常显示的那样 有人知道如何停止缓存并在生成数据时将其刷新到浏览器中吗 谢谢, J首先

我正在编写一个PHP脚本,它可以在不预先知道长度的情况下动态生成大的(多MB)输出。我直接写信给
php://output
通过
fwrite()
并尝试了标准输出和使用
传输编码:chunked
(根据需要对区块进行编码),但无论我尝试什么,浏览器都会等到所有数据写入后才显示下载对话框。我也尝试过在头和每个块之后使用
flush()
ing,但这也没有什么区别

我猜Apache正在缓存输出,就像浏览器从服务器收到几kB数据后通常显示的那样

有人知道如何停止缓存并在生成数据时将其刷新到浏览器中吗

谢谢,
J

首先,就像布拉姆在他的评论中提到的那样,如果在PHP配置中启用了OutputBuffering,它将不起作用,因此了解您的phpinfo()会很有用

下一件事,如果它与存储在您的Web服务器上的一个大文件一起工作,请使用inf readfile输出它。同时,检查您是否发送了正确的标题。此处提供了有关如何读取文件()和发送正确标题的提示:


当您正在使用时,请在脚本顶部调用或。

我建议使用wireshark或类似工具查看哪些数据正在发送到浏览器,而不是猜测整个内容生成之前apache不会刷新。如果需要放慢速度,请插入一些
sleep(1)
调用。(我怀疑Apache在刷新缓冲区之前是否在单个套接字上维护了数兆字节。)我的猜测是,您在php.ini和/或Apache config中启用了GZIP压缩。在这种情况下,apache总是缓存。我们还没有找到避免这种情况的方法(除了禁用压缩),所以让我们看看其他人对此了解多少。可能是serverfault.com的一个问题,但是…@sarnold-当我说我猜测这是一个有根据的猜测,因为我一直在通过Fiddler跟踪请求,直到下载对话框出现才看到任何响应,所以我很有信心它正在服务器端缓存@你说GZIP被启用是完全正确的,我认为这不是一个可能的原因,因为这是一个流压缩算法,但这可能是问题所在。我将尝试禁用此特定脚本,看看会发生什么。谢谢。@user290796,啊哈,那不是真的“猜测”如果@BlaM是正确的,也许您可以编写自己的Apache输出过滤器来定期发送刷新桶,以保留gzip的好处。(对于保存大文件似乎真的很有用。)是的,尽管我不能100%确定Fiddler在显示之前没有等待完整的输出,所以它只是在猜测;)。被输出的文件实际上是一个ZIP文件,所以它已经被压缩了,所以保留GZIP可能没有什么好处,但是输出过滤器可能是一个选项。我现在不在服务器附近尝试禁用GZIP,但今天晚些时候我会尝试一下。