【发布时间】:2009-03-16 12:09:56
【问题描述】:
我知道这是可能的,但我似乎无法弄清楚。
我有一个有几十万个结果的 mySQL 查询。我希望能够发送结果,但似乎响应需要 content-length 标头才能开始下载。
在phpMyAdmin中,如果你去导出一个数据库,它会立即开始下载,FF只是说未知文件大小,但它可以工作。我查看了该代码,但无法弄清楚。
帮助?
谢谢。
【问题讨论】:
我知道这是可能的,但我似乎无法弄清楚。
我有一个有几十万个结果的 mySQL 查询。我希望能够发送结果,但似乎响应需要 content-length 标头才能开始下载。
在phpMyAdmin中,如果你去导出一个数据库,它会立即开始下载,FF只是说未知文件大小,但它可以工作。我查看了该代码,但无法弄清楚。
帮助?
谢谢。
【问题讨论】:
this document 在第 14.14 节中指出,在 HTTP 中,只要可以在传输之前确定消息的长度,就应该发送它,除非第 4.4 节中的规则禁止这样做。这意味着如果您不能说出它的大小,则不必发送它。
只是不要发送它。
如果您想在所有数据可用之前将部分数据发送到浏览器,您是否刷新您的输出缓冲区?也许这就是问题所在,而不是缺少标题?
你使用flush的方式是这样的:
因此,如果您的查询返回大量结果,您可以只生成 100 或 1000 个结果的输出,然后刷新,依此类推。
另外,要告诉客户端浏览器尝试保存文件而不是在窗口中显示它,您也可以尝试使用 Content-disposition: attachment 标头。请参阅此处的specification 19.5.1 部分。
【讨论】:
您可以使用分块传输编码。基本上,您发送一个“Transfer-encoding: chunked”标头,然后以分块模式发送数据,这意味着您发送一个块的长度,然后是该块。您不断重复此操作,直到数据结束,此时您发送一个长度为零的块。
详情在RFC 2616。
【讨论】:
您可能正在使用等待所有内容生成的 gzip。检查您的 .htaccess 以获取有关此的指令。
【讨论】:
您不需要设置 Content-Length 标头字段。此标头字段只是告诉客户端它必须预期的数据量。事实上,一个“错误”的值可能会导致客户端丢弃一些数据。
【讨论】:
如果您在 FireFox 中使用 LiveHTTPHeaders 插件,您可以看到 phpMyAdmin 发送的标头与您的应用程序发送的标头之间的差异。我不知道你具体错过了什么,但这应该给你一个提示。我看到运行快速测试的一个标题是“Transfer-Encoding:chunked”,我还看到他们没有发送内容长度。如果您还没有 FireFox 插件,请点击以下链接: LiveHTTPHeaders
【讨论】:
http 内容长度是一个应该字段,所以你可以删除它... 但是你必须设置传输编码然后 看看Why "Content-Length: 0" in POST requests?
【讨论】: