Не хватает памяти для записи файлов в 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 в памяти перед записью на диск, когда объект уничтожен.
б) Должен ли я использовать другую библиотеку, которая была бы лучше для этого?
в) Должен ли я принять другой подход здесь? Например, если пользователь загружает несколько небольших почтовых индексов вместо одного большого почтового индекса. (В идеале я хочу, чтобы они загружали только один файл независимо)