【问题标题】:How to send data in PHP without content-length?如何在没有内容长度的 PHP 中发送数据?
【发布时间】:2009-03-16 12:09:56
【问题描述】:

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

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

在phpMyAdmin中,如果你去导出一个数据库,它会立即开始下载,FF只是说未知文件大小,但它可以工作。我查看了该代码,但无法弄清楚。

帮助?

谢谢。

【问题讨论】:

    标签: php mysql header


    【解决方案1】:

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

    只是不要发送它。

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

    你使用flush的方式是这样的:

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

    因此,如果您的查询返回大量结果,您可以只生成 100 或 1000 个结果的输出,然后刷新,依此类推。

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

    【讨论】:

    • 我有标题,然后我有刷新,然后我有 sql 查询。刷新后它不会弹出任何保存对话框。小文件时,只有在文件下载完成后才会弹出。我正在尝试的 sql 查询需要 45 秒,并且在发送标头后一直超时。
    • 在 anwser 中详细说明
    • 我的标题: header('Content-Type: "'.$mime.'"'); header('Content-Disposition: attachment; filename="'.$filename.'"'); header("内容传输编码:二进制"); header('过期时间:0'); header('Pragma: no-cache');
    • 不幸的是,我什至没有到达缓冲点,它正在查询超时。通常,我发送一个'nbsp;'所以浏览器不会超时,但是因为它是一个文件,所以我不能把它写进去。标题似乎并没有阻止它超时......
    • 现在是 1800。它的浏览器超时了。如果我回显一个周期,它可以防止超时。所以我重新排列了所有内容,并首先刷新 csv 的标题行,然后立即开始下载。然后它在等待查询完成时说“开始下载”。
    【解决方案2】:

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

    详情在RFC 2616。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您不需要设置 Content-Length 标头字段。此标头字段只是告诉客户端它必须预期的数据量。事实上,一个“错误”的值可能会导致客户端丢弃一些数据。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-03-17
              • 2021-12-07
              • 2012-03-01
              • 2016-04-23
              • 1970-01-01
              相关资源
              最近更新 更多