file — php file_get_contents (): содержимое усекается с 2147483648 до 2147483647 байт

Как я могу выяснить проблему, когда я собираюсь создать 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);

4

Решение

я меняю $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);

?>

Вы можете прочитать больше на:

http://php.net/manual/en/ziparchive.addfile.php

5

Другие решения

Вы никогда не сможете выделить больше памяти, чем 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.

4

попробуйте поставить эту строку в начале вашего кода:

ini_set("memory_limit", -1);

Обратитесь к этому вопросу
Неустранимая ошибка: недостаточно памяти (выделено 1134559232) (попытка выделить 32768 байт) в X: \ wamp \ www \ xxx

-3
По вопросам рекламы [email protected]