php zip архив памяти, ОЗУ и максимальный размер файла

У меня есть папки с пользовательскими изображениями, которые становятся довольно большими. При попытке zip эти я получаю ошибки вокруг 1.5 gig размера zip-файлов.

мои вопросы связаны с памятью, и я думаю, что php держит как zip открытым, так и все изображения в памяти. Возможное решение, которое у меня есть, - отправить каждое изображение при загрузке в zip-файл в дополнение к соответствующей папке, это, похоже, работает до сих пор, но каковы пределы размера zip-файла, из того, что я могу найти около 4 ГБ. Как это влияет / взаимодействует с объемом ОЗУ на сервере? и это ограничение на самом деле 4gb или я могу продолжать добавлять файлы в zip бесконечно или я должен иметь скрипт проверить размер zip, и если он над X gigs переименовать его и создать новый zip. Я искал google и читал документацию, но нашел противоречивую информацию или неполную информацию, поэтому я ищу некоторые окончательные ответы и советы. Спасибо

3 ответов


используйте php exec и вызовите zip-инструмент в командной строке

 exec("tar -zcvf archive.tar.gz /folder/tozip");

убедитесь, что пользователь, выполняющий php-файл, имеет доступ к папке, которую вы хотите zip

и позаботьтесь о коде впрыски.


Если вы все еще хотите использовать PHP ZipArchive, есть несколько вещей, которые вы можете сделать, чтобы предотвратить определенные ограничения сервера / ОС:

  • хотя это может показаться очевидным в вашем случае, я видел много примеров использования ZipArchive, которые используют addFromString для добавления нового файла в архив. НЕТ! Это выделит память, чтобы открыть файл и сохранить его содержимое в нем, что заставит вас бежать из памяти быстро, используйте файлов addfile. Также убедитесь, что вы освободили всю память, которая вам не нужна.

  • срок исполнения увеличьте максимальное время выполнения вашего скрипта, либо через php.Ини, или с безопасность (например,ini_set('max_execution_time', 600); максимальное время выполнения 10мин)

  • Ручки некоторые ОС имеют ограничения на количество открытых файлов, которые могут вызвать проблему, потому что PHP добавляет только файлы в zip после закрытия zip-файла. Чтобы предотвратить проблемы с количеством открытых файлов, просто закройте и откройте zip-файл каждые x-файлы (например, каждые 1000), это заставит PHP сжимать и добавлять файлы, уже назначенные архиву.

  • Размер Файла могут быть некоторые ограничения размера файла ОС, больший файл также означает, что PHP нужно больше памяти для управления им, поэтому я лично предпочитаю использовать максимальный размер файла, после чего я просто открываю новый zip-файл с использованием индексного номера. Если точный размер файла не имеет для вас значения, вы можете просто подсчитать размер файлов, поступающих в архив, а затем переключиться после достижения определенного предела, или вы можете закрыть архив каждые x файлов и проверить его размер на диске, чтобы решить, стоит ли запускать новый архив или нет (помните, файлы сжимаются только после того, как вы закрыть в архиве)

Мне лично нравится ограничивать размер файла, получая размер файлы, входящие в архив и применяющие к нему вероятный коэффициент сжатия, чтобы увидеть, когда будет достигнут максимальный размер архива (jpg-файлы ~0.9, zip-файлы = 1, текстовые файлы ~0.10,...) и затем переключитесь на следующий том.


поскольку поток или память все еще могут использоваться, вы должны "очистить" архив из памяти после каждого / некоторых файлов:

$zip->close();
unset($zip);
$zip = new ZipArchive;
$zip->open("arch.zip");