如何在没有内容长度的PHP中发送数据?

时间:2009-03-16 12:09:56

标签: php mysql header

我知道这是可能的,但我似乎无法弄明白。

我有一个mySQL查询,有几十万个结果。我希望能够发送结果,但似乎响应需要内容长度标题才能开始下载。

在phpMyAdmin中,如果你去导出一个数据库,它会立即开始下载,FF只是说明了未知的文件大小,但是它有效。我查看了那段代码,但无法理解。

帮助?

感谢。

6 个答案:

答案 0 :(得分:10)

第14.14节中的

this document声明在HTTP中,只要在传输之前确定消息的长度,就应该发送它,除非4.4节中的规则禁止这样做。这意味着如果你不能说出它的大小,就不必发送它。

请勿发送。

如果要在所有数据可用之前将部分数据发送到浏览器,您刷新输出缓冲区吗?也许那是什么问题,而不是缺少标题?

你使用同花顺的方式是这样的:

  • 生成某些输出,应将其添加到缓冲区
  • flush()它应该将当前缓冲区发送到客户端
  • 转到1

所以,如果你的查询返回了很多结果,你可以生成输出,比如100或1000,然后刷新,等等。

此外,要告诉客户端浏览器尝试保存文件而不是在窗口中显示文件,您也可以尝试使用 Content-disposition:attachment 标头。请参阅此处的specification,19.5.1部分。

答案 1 :(得分:2)

您可以使用分块传输编码。基本上,您发送一个“Transfer-encoding:chunked”标头,然后数据以分块模式发送,这意味着您发送一个块的长度,然后是块。你不断重复这个直到数据结束,此时你发送一个零长度的块。

详细信息位于RFC 2616

答案 2 :(得分:1)

您可能正在使用等待生成所有内容的gzip。检查.htaccess是否有关于此的指示。

答案 3 :(得分:0)

您无需设置Content-Length标头字段。此标头字段只是告诉客户端它预期的数据量。实际上,“错误”值可能导致客户端丢弃某些数据。

答案 4 :(得分:0)

如果您使用FireFox中的LiveHTTPHeaders插件,您可以看到phpMyAdmin发送的标头与您的应用程序发送的标头之间的区别。我不知道你错过了什么,但这应该给你一个提示。我看到运行快速测试的一个标题是“Transfer-Encoding:chunked”,我也看到他们没有发送内容长度。这是FireFox插件的链接,如果你还没有它: LiveHTTPHeaders

答案 5 :(得分:0)

http内容长度是一个SHOULD字段,所以你可以删除它... 但是你必须设置传输编码 看看Why "Content-Length: 0" in POST requests?