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