【问题标题】:PHP Large Files Zipping with folders that don't exist in the file-systemPHP大文件使用文件系统中不存在的文件夹进行压缩
【发布时间】:2024-01-06 16:11:01
【问题描述】:

我正在创建某种文件共享应用程序。在此应用程序中,您应该能够上传和下载文件并构建这些文件。

我选择不继续操作文件系统。但是我根据时间戳将文件上传到文件夹中,并将重要信息存储在数据库中并在数据库中构建它们。所以没有真正的子文件夹,只有数据库中的关系来将这些文件构建到文件夹中。

不,我想让用户通过压缩来下载文件夹(包括子文件夹)。但是我想在将要下载的 zip-archive 中重新创建这个文件夹结构(用户在前端看到的)。我已经设法使用 PHP 的 ZipArchive 类做到了这一点:http://php.net/manual/en/class.ziparchive.php 但这有一个大问题。压缩大文件时会占用大量内存和 CPU。并且系统必须能够处理大文件(>1GB)我不可能允许 PHP 使用 >1GB 的内存?!

现在我发现了一个 * 问题,可以在 php 中使用更少的内存压缩大文件: https://*.com/a/4357904/383731

这似乎使用了 Unix Zip 命令,但是是否可以在文件系统中不存在这些 zip 的情况下在这些 zip 中创建文件夹?

【问题讨论】:

  • hmm... 创建一个临时目录,创建一个存档文件并删除这样的目录:mkdir a; mkdir b; zip -r arch.zip .; rm -rf a b;.
  • @mkjasinski 我不想使用真正的文件系统。我已经用 Oliver A. 的解决方案解决了这个问题,创建了符号链接 ...

标签: php unix compression zip


【解决方案1】:
  • 在您的临时目录中创建一个文件夹
  • 为真实文件添加子文件夹和links
  • 压缩包
  • 发送它
  • 杀死临时文件

关于链接的部分很重要。如果您只使用链接,您实际上不必复制文件内容。您所做的只是给 zip 工具一个提示,它可以在哪里找到您想要包含在存档中的内容

编辑:

符号链接和硬链接都有效,上面的链接解释了如何使用符号链接。

【讨论】:

  • 简洁的解决方案(虽然硬链接在同一个文件系统上的工作方式和符号链接一样 - 符号链接是最好的选择,但不是因为你建议的原因)
  • @symcbean 是真的。导入部分是“链接不要复制”。
  • 这似乎是一个不错的解决方案,我要试试这个并告诉你!
  • 谢谢你的工作!是否需要清理符号链接?还是在我删除文件夹时它们会自动删除?