Как я могу выяснить проблему, когда я собираюсь создать ZIP-файл размером 2 ГБ.
ошибка
file_get_contents (): урезанное содержимое с 2147483648 до 2147483647
байтовНеустранимая ошибка: недостаточно памяти (выделено 2151677952) (попытался выделить
18446744071562067968 байт) в
Я использую выделенный сервер и уже настроен memory_limit,max_execution_time,max_upload_filesize,max_post_size
, Но это не работает для меня. Пожалуйста, проверьте мой код и дайте мне знать, что я делаю неправильно —
$zip = new ZipArchive();
# create a temp file & open it
$tmp_file = tempnam('.','');
$zip->open($tmp_file, ZipArchive::CREATE);
# loop through each file
foreach($files as $file){
# download file
$download_file = file_get_contents($file_path.'/'.$file);
#add it to the zip
$zip->addFromString(basename($file_path.'/'.$file),$download_file);
}
# close zip
$zip->close();
$zip_name = $last_seg.'.zip';
# send the file to the browser as a download
header("Content-disposition: attachment; filename=$zip_name");
header('Content-type: application/zip');
readfile($tmp_file);
я меняю $zip->addFromString()
в $zip->addFile()
потому что вам не нужно читать файл содержимого, чтобы добавить файл, я тестирую ваш код с 3 фильмами и не работает (у меня была та же ошибка), но когда я использую $zip->addFile()
все идет хорошо, и я могу скачать ZIP-файл с 3 ГБ.
Мне нужно использовать set_time_limit(0);
Если вы хотите проверить этот код, измените только значения:
$files //Array of files name
$file_path //Path where your files ($files) are placed
$last_seg //The name of your zip file
<?php
set_time_limit(0);
$files = array('Exodus.mp4', 'the-expert.webm', 'what-virgin-means.webm');
$file_path = 'zip';
$last_seg = 'test';
$zip = new ZipArchive();
# create a temp file & open it
$tmp_file = tempnam('.','');
$zip->open($tmp_file, ZipArchive::CREATE);
# loop through each file
foreach($files as $file){
$zip->addFile($file_path.'/'.$file, $file);
}
# close zip
$zip->close();
$zip_name = $last_seg.'.zip';
# send the file to the browser as a download
header("Content-disposition: attachment; filename=$zip_name");
header('Content-type: application/zip');
readfile($tmp_file);
?>
Вы можете прочитать больше на:
Вы никогда не сможете выделить больше памяти, чем PHP_INT_MAX. Так что, возможно, версии PHP для Linux x64 справятся с этим, если file_gets_content внутренне не ограничен 32-битным знаком со знаком, но в Windows или в 32-битной системе у вас нет шансов достичь этого без потоковой передачи.
Нечто подобное может работать: (еще не проверено)
$fr = fopen("http://...", "r");
$fw = fopen("zip://c:\\test.zip#test", "w");
while(false !== ($buffer = fread($fr, 8192)))
{
fwrite($fw, $buffer, strlen($buffer));
}
fclose($fr);
fclose($fw);
Хорошо, мой плохой PHP, по-видимому, не предоставляет режим «+ w» для потока zip … Тогда последними вашими вариантами будет запись всего файла во временный файл (путем его потоковой передачи, как я это сделал, без file_get_contents) перед его передачей. во внешнюю программу (с помощью вызова system () или popen …) или с использованием другого формата сжатия (очевидно, php поддерживает операцию потока записи для zlib ant bzip2) или используйте внешнюю библиотеку для php.
попробуйте поставить эту строку в начале вашего кода:
ini_set("memory_limit", -1);
Обратитесь к этому вопросу
Неустранимая ошибка: недостаточно памяти (выделено 1134559232) (попытка выделить 32768 байт) в X: \ wamp \ www \ xxx