【问题标题】:How should the temporary file be saved when creating and download zip file using PHP?使用 PHP 创建和下载 zip 文件时应如何保存临时文件?
【发布时间】:2015-11-14 10:30:37
【问题描述】:

我希望在服务器上压缩一个目录并将其下载给用户。我在这个网站上找到了有关如何压缩目录的大量信息。

让我难过的部分是存储临时文件的位置。根据我的阅读,zipArchive 要求将 zip 文件保存在服务器上,不保存就无法下载。对吗?

我见过一些解决方案,他们建议将其保存为“somename.zip”,然后使用readfile() 以及相应的标头进行下载,然后在下载后使用unlink() 将其删除。但是在哪里存储“somename.zip”以及如果发生冲突怎么办?

所以,然后我开始考虑我应该在某个临时目录中创建一个具有随机名称的文件。或者我应该使用tmpfile() 之类的东西,但它会返回一个文件处理程序,我不知道它如何与 zipArchive 一起使用。

对于我的应用程序,目录的大小相当小,甚至不想将其写入磁盘,而是写入内存。也许像$tmp_handle = fopen('php://temp', 'r+'); 这样的东西,但这又会返回一个文件处理程序,我不知道它如何与 zipArchive 一起工作。

zipArchive创建的zip文件应该如何临时保存?

【问题讨论】:

  • @MarcB 谢谢。是的,我目前正在使用$temp_file = tempnam(sys_get_temp_dir(), "ZIP");。似乎工作。不知道我的记忆存储想法有没有优点...

标签: php linux file zip


【解决方案1】:

由于 ZipArchive 类适用于堆叠流,$filename 参数不能是 php://tempphp://memory。它必须是文件系统上的“真实”文件路径。

一些思路:

  • 正如评论中所说,tempnam() 函数可以帮助您避免临时文件名冲突。我认为暂时存储文件并readfile()'ing 它是最常见且不错的选择

  • 如果您绝对希望将该临时文件存储在内存中,您可以在您的 Linux 系统上挂载一个tmpfs 目录。它将被视为 PHP 的“普通”目录,但将存储在 RAM 中

  • 如果您可以使用shell_exec()函数,您可以在命令行中压缩目录并在PHP中读取输出:它将存储在内存中。

在我看来,在大多数情况下,第一个选项(您的第一个想法)更好,因为:

  • 允许使用shell_exec() 可能很危险

  • 如果有一天你有大文件要压缩,这可能会填满内存,导致性能很差

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2015-11-17
    相关资源
    最近更新 更多