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

如何在PHP中发送没有内容长度的数据?,php,mysql,header,Php,Mysql,Header,我知道这是可能的,但我似乎不明白 我有一个mySQL查询,它有几十万个结果。我希望能够发送结果,但响应似乎需要开始下载content-length标头 在phpMyAdmin中,如果要导出数据库,它会立即开始下载,FF只是说文件大小未知,但它可以工作。我看了一下那个代码,但想不出来 帮忙 谢谢。您不需要设置内容长度标题字段。此标头字段仅用于告诉客户端它必须预期的数据量。事实上,“错误”的值可能会导致客户端丢弃一些数据。第14.14节中指出,在HTTP中,只要在传输之前可以确定消息的长度,就应该发

我知道这是可能的,但我似乎不明白

我有一个mySQL查询,它有几十万个结果。我希望能够发送结果,但响应似乎需要开始下载content-length标头

在phpMyAdmin中,如果要导出数据库,它会立即开始下载,FF只是说文件大小未知,但它可以工作。我看了一下那个代码,但想不出来

帮忙


谢谢。

您不需要设置
内容长度
标题字段。此标头字段仅用于告诉客户端它必须预期的数据量。事实上,“错误”的值可能会导致客户端丢弃一些数据。

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

别送了

如果要在所有数据可用之前将部分数据发送到浏览器,是否刷新输出缓冲区?也许这就是问题所在,不是缺少头球

使用flush的方式如下所示:

  • 生成一些输出,这些输出应将其添加到缓冲区中
  • flush()it,它将向客户端发送当前缓冲区
  • 转到1
因此,如果查询返回大量结果,您可以只为其中的100或1000个生成输出,然后刷新,依此类推


另外,要告诉客户端浏览器尝试保存文件而不是在窗口中显示文件,您也可以尝试使用Content disposition:附件标题。请参阅here,19.5.1部分。

如果您在FireFox中使用LiveHTTPHeaders插件,您可以看到phpMyAdmin发送的头与应用程序发送的头之间的差异。我不知道你具体遗漏了什么,但这应该给你一个提示。我在运行快速测试时看到的一个标题是“Transfer Encoding:chunked”,我还看到它们没有发送内容长度。如果您还没有FireFox插件,这里有一个指向该插件的链接:
http内容长度是一个应该字段,因此您可以删除它。。。 但是你必须设置传输编码
看看

您可能正在使用等待生成所有内容的gzip。检查.htaccess以获取有关此的指令。

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


详细信息在中。

我有标题,然后我有刷新,然后我有sql查询。不过,刷新后不会弹出任何保存对话框。当下载一个小文件时,只有在下载完文件后才会弹出。我正在尝试的sql查询需要45秒,并且在发送标头后会一直超时。请在anwserMy headers:header('Content-Type:'.$mime'.'中再指定一点);标题('Content-Disposition:attachment;filename=“.”.$filename.'”);标题(“内容传输编码:二进制”);标题('Expires:0');标题('Pragma:no cache');不幸的是,我甚至没有到达缓冲点,它在查询上超时了。通常,我会发送“nbsp;”所以浏览器不会超时,但由于它是一个文件,我不能将其写入。标题似乎没有阻止它超时…它在1800。是浏览器超时了。如果我回显一个周期,它会阻止超时。所以我重新安排了一切,让它先刷新csv的标题行,然后它马上开始下载。然后,在等待查询完成时,它会显示“正在开始下载”。