【问题标题】:Streaming large (200 MB) zip through PHP通过 PHP 流式传输大型 (200 MB) zip
【发布时间】:2013-03-18 19:13:24
【问题描述】:

我正在为我的应用程序创建一个服务器端 API。其中一个步骤要求应用程序从我的服务器下载一个非常大的 zip 文件,但仅通过下载 http://mydomain.com/file.zip 无法完成。我的应用通过了一些身份验证标头和其他安全内容,这些内容必须由 php 脚本处理(例如 http://mydomain.com/download.php?auth=foo&key=value&etc

我之前用图片做过这种事情:

<?php

$can_download = /* some complicated auth stuff */

if($can_download) {
    header('Content-Type: image/jpeg');
    echo file_get_contents('image.jpg');
}

?>

我的问题是:可以用 200+ MB 的 zip 文件完成吗? 我知道我必须以某种方式修改标题并且可能使用一些高级 php 函数,但我也找不到任何教程在这里,在 Stack Overflow 上,也没有其他任何地方。

编辑:我还必须能够恢复我的下载,因为用户很可能会退出应用程序,尽管它应该能够恢复下载(例如从 47%)。可以吗?


对于那些寻找答案的人:正确的函数是 readfile 并且可以使用 this custom function 解决“恢复”问题。

【问题讨论】:

    标签: php stream zip


    【解决方案1】:

    在此实例中使用的正确函数是readfile

    给定的代码会遇到问题,因为它在将文件内容转发到浏览器之前不必要地将文件内容加载到内存中。这无助于提高性能,并且很容易导致内存不足。

    【讨论】:

    • 请注意,此解决方案虽然在资源使用方面是最佳的,但不提供对 HTTP 范围的支持,这对于可能因各种原因而中断的非常大的文件下载可能很有用
    • @SirDarius 你的意思是我不能简单地“恢复”我的下载?
    • @AdrianKahsivskyy readfile 不支持在文件中指定范围,并且无论如何都不会自动支持关联的 HTTP 请求标头,请参阅php.net/manual/fr/function.readfile.php#86244 以尝试解决此问题
    • @AdrianKahsivskyy:你不能。如果您想这样做,您必须解析 Range 请求标头,然后手动使用 fseek/fread 以仅提供请求的内容部分。您的回复还必须包含 Accept-RangesContent-Range 标头。
    • @Jon 看起来php.net/manual/fr/function.readfile.php#86244 解决了这个问题。 :)
    【解决方案2】:

    是的,但是您想改用 readfile 之类的东西。原因是file_get_contents 将整个文件读入内存,然后再将其传递给客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-18
      • 2021-01-31
      • 2018-03-06
      • 2011-05-23
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多