0

我正在编写一个工具,将用户上传的图像收集到一个 zip 存档中。为此,我遇到了 Flysystem 的 ZipArchiveAdapter,它似乎做得很好。

当 zip 存档中的文件数量达到数千时,我遇到了内存限制问题。

当用户的图像数量开始超过 1000 个时,它通常会由于可用内存耗尽而失败。为了达到它似乎可以处理少于 1000 张图像的大多数用户的地步,我将内存限制增加到 4GB,但将其增加到超出这个范围并不是一个真正的选择。

此时的简化代码:

<?php
use League\Flysystem\Filesystem;
use League\Flysystem\ZipArchive\ZipArchiveAdapter;
use League\Flysystem\Memory\MemoryAdapter;

class User {
    // ... Other user code

    public function createZipFile()
    {
        $tmpFile = tempnam('/tmp', "zippedimages_");
        $download = new FileSystem(new ZipArchiveAdapter($tmpFile));

        if ($this->getImageCount()) {
            foreach ($this->getImages() as $image) {
                $path_in_zip = "My Images/{$image->category->title}/{$image->id}_{$image->image->filename}";
                $download->write($path_in_zip, $image->image->getData());
            }
        }
        $download->getAdapter()->getArchive()->close();
        return $tmpFile;

        // Upload zip to s3-storage
    }
}

所以我的问题是:a)有没有办法让 Flysystem “随时随地”将 zip 文件写入磁盘?目前,当对象被销毁时,它将整个 zip 存储在内存中,然后再写入磁盘。

b)我应该使用另一个对此更好的库吗?

c) 我应该在这里采取另一种方法吗?例如让用户下载多个较小的 zip 而不是一个大的 zip。(理想情况下,我希望他们只下载一个文件)

4

0 回答 0