Не хватает памяти для записи файлов в zip с помощью flysystem

Я программирую инструмент, который собирает загруженные пользователем изображения в zip-архив. Для этого я наткнулся на ZipArchiveAdapter от Flysystem, который, кажется, хорошо справляется со своей задачей.

Я сталкиваюсь с проблемой ограничения памяти, когда количество файлов в zip-архиве исчисляется тысячами.

Когда количество изображений для пользователя начинает превышать 1000, обычно происходит сбой из-за исчерпания доступной памяти. Чтобы приблизиться к тому моменту, когда кажется, что большинство пользователей обрабатывают менее 1000 изображений, я увеличил лимит памяти до 4 ГБ, но увеличить его сверх этого на самом деле невозможно.

Упрощенный код на данный момент:

<?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
    }
}

Итак, мои вопросы: а) Есть ли способ заставить Flysystem записывать в zip-файл "на ходу" на диск? В настоящее время он сохраняет весь zip в памяти перед записью на диск, когда объект уничтожен.

б) Должен ли я использовать другую библиотеку, которая была бы лучше для этого?

в) Должен ли я принять другой подход здесь? Например, если пользователь загружает несколько небольших почтовых индексов вместо одного большого почтового индекса. (В идеале я хочу, чтобы они загружали только один файл независимо)

0 ответов

Другие вопросы по тегам