Я работаю над сценарием, который использует метод extractTo ZipArchive для распаковки некоторых довольно больших файлов (некоторые более 10G). Все отлично работает с небольшими файлами, но я тестировал его с файлами ~ 4G и заметил, что распаковка работает до определенного момента, затем она фактически перестает распаковываться. Тем не менее, скрипт PHP, похоже, работает. Нет ошибок или исключений. С терминала я сижу в папке и продолжаю набирать ls -la, чтобы посмотреть, как увеличивается размер извлеченного файла. Он делает это некоторое время, затем останавливается, и скрипт продолжает загружаться (просмотр через браузер и через верхнюю часть). Затем скрипт будет работать в течение указанного периода времени (я установил 3600) и выдаст ошибку времени ожидания. На коробке установлен Centos 6.6, 16 ГБ оперативной памяти, много вычислительной мощности и много места на диске. Кажется, происходит сбой при разархивированном 5011800064 байтах. Вот некоторые избранные фрагменты моего кода:
set_time_limit(1200);
ini_set('memory_limit', '1024M');
$zip = new ZipArchive;
$res = $zip->open($zipPath);
if ($res === TRUE)
{
$extres = $zip->extractTo(
$unzipPath,
$filesToExtract
);
$zip->close();
}
Любая помощь будет принята с благодарностью. Мне также любопытно узнать, пытается ли функция extractTo () загрузить весь zip-файл в память? Я изучил документацию по PHP и не могу найти что-нибудь подходящее. Все связанные посты либо не имеют ответов и не были конкретными в их объяснении проблемы.
Изменить: Просто чтобы подтвердить, у меня есть более 20G бесплатно и установка различных ограничений памяти для сценария не меняет количество распакованных байтов.
Обновление: я просмотрел httpd.conf, php.ini и не могу найти какие-либо настройки, запрещающие работу операций распаковки.
Традиционный .zip архив ограничен в размере до 4 ГБ:
Максимальный размер как архивного файла, так и отдельных файлов внутри него составляет 4 294 967 295 байт (232–1 байт или 4 ГиБ минус 1 байт) для стандартного .ZIP и 18 446 744 073 709 551 615 байт (264–1 байт или 16 EiB минус 1 байт). ) для ZIP64.
Чтобы распаковать большие архивы, используя ZIP64 в PHP, вам нужно использовать PHP 5.6 который использует libzip 0.11.2.
Других решений пока нет …