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");