【问题标题】:Dynamically creating large zip's for client downloads为客户端下载动态创建大 zip
【发布时间】:2011-11-10 18:39:20
【问题描述】:

有一个项目,每个用户都可以下载一个包含大约 2GB 数据的 zip...

唯一的问题是每个用户必须在此 zip 中更改几个非常小的文件。

除了不需要全部都在 zip 中之外,有没有一种优雅的方法来解决这个问题?我考虑过的想法:

1) 将待处理订单推送到队列中,并在资源可用时处理该队列...处理意味着为每个订单创建一个新的 zip,然后在 N 天后将其删除

2) 以某种方式在 PHP 中操作 zip,然后通过原始类型的推送发送(即吐出标题,然后根据文件 + 自定义文件生成数据)

对于我可能遇到的最佳方法或内存问题有什么想法吗?谢谢!

【问题讨论】:

  • 如果 PHP 文件指针是 32 位的,我不确定,如果文件大于 2GB,你很可能会遇到严重的问题。
  • 我找到了一个可以解决这个确切问题的库-pablotron.org/software/zipstream-php

标签: php linux apache architecture amazon-web-services


【解决方案1】:

ZIP文件结构基本上是:

  1. 魔术头,将文件标识为 ZIP 存档。
  2. 所有文件数据,连接在一起。 (可以选择压缩单个文件。)
  3. 存档目录,包含文件元数据(名称、大小等)以及文件数据的偏移量。

这意味着您应该能够即时构建和输出 ZIP 存档,只需要将目录数据保留在内存中,直到您可以在最后将其写出。 ZIP 存档本身永远不需要存在于磁盘上。

如果您使用这种方法,一次将 ZIP 文件提供给多个客户端不会出现并发问题,并且您在构建存档时不必使用任何磁盘空间。

【讨论】:

    【解决方案2】:

    恕我直言

    你可以考虑两个 zip 文件的方法

    1. 第一个 zip 将包含所有常用文件,并将其作为静态文件进行下载(但是,通过 http 传输 Gb 不可靠,您可以建议用户使用 scp、ftp 或任何允许继续下载的客户端程序)
    2. 第二个 zip(php 脚本)应该包含几个非常小的文件,这些文件只指定给用户,在这种情况下,您可以将内存/磁盘空间的开销降至最低

    【讨论】:

      【解决方案3】:

      你看过 PHP 的 zip 扩展吗? http://php.net/zip

      据我所知,您可以以 OOP 方式即时操作 ZIP 存档。我只是不确定性能,可能是 2GB 拉链可能需要一些时间来操作,但您必须自己尝试。

      【讨论】:

        猜你喜欢
        • 2014-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-06
        • 2014-06-16
        • 2018-10-08
        • 1970-01-01
        相关资源
        最近更新 更多