2016-01-11 3 views
4

Я использую php ZipArchive для создания zip-файла каталога. Код работает отлично для почти всех каталогов, кроме двух, которые являются самыми большими (самый большой каталог в настоящее время содержит 51 файл с общим объемом 175 МБ). Когда я запускаю код для этих каталогов, временный файл ('filename.zip. [RandomLettersAndNumbers]', например 'filename.zip.riaab4') будет создан с размером 67 108864 байт, и скрипт выдает внутреннюю ошибку сервера (500).PHP: Ошибка (500) при создании zip-файла с ZipArchive

То, что я пытался до сих пор (большинство из них до сих пор видны в источнике):

  • Увеличение memory_limit
  • Увеличение max_execution_time
  • Проверьте журнал ошибок PHP: журнал ошибок пуст
  • Попробуйте найти строку, где происходит ошибка: код выполняется до $zip_archive->close();

//Temporary (debugging) START 
ini_set("log_errors", 1); 
ini_set("error_log", "php-error.log"); 
error_log("Hello errors."); 
ini_set('memory_limit','512M'); 
set_time_limit(180); 
//phpinfo(); 
//Temporary (debugging) END 

//Get selected directory 
// --> Code removed 
$result['directory'] = 'directory1';  

//Create .zip file 
$zip_archive = new ZipArchive(); 
$ZIP = 'files/'.$result['directory'].'.zip'; 

if($zip_archive->open($ZIP, ZipArchive::CREATE | ZIPARCHIVE::OVERWRITE) !== TRUE) { 
    echo 'Error! Error while creating ZIP Archive.'; 
    die; 
} 

foreach(new DirectoryIterator('files/'.$result['directory']) as $fileInfo) { 
    if($fileInfo->isDot()) 
     continue; 
    if(file_exists($fileInfo->getPath())) 
     $zip_archive->addFile('files/'.$result['directory'].'/'.$fileInfo->getFilename(), $fileInfo->getFilename()); 
} 

//Temporary (debugging) START 
echo '<br><br><br>'; 
var_dump($zip_archive->close()); 
// ## The following lines are not executed!! ## 
echo '<br><br><br>'; 
var_dump($zip_archive->getStatusString()); 
echo '<br><br><br>'; 
//Temporary (debugging) END 

if($zip_archive->numFiles > 0 && $zip_archive->close() == true) 
    $FILE = $ZIP; 
else { 

} 

Я что-то упустил? Если есть что-то еще, я могу попробовать, пожалуйста, дайте мне знать. Благодарю.

EDIT: У меня есть более конкретный вопрос: почему временные zip-файлы затронутых каталогов имеют размер файла 67,108,864 байт? Связано ли это с максимальным размером файла, установленным php/сервером, или это можно объяснить стандартом zip-стандарта/ZipArchive?

+0

Apache или Nginx? Я думаю, PHP работает, но потому что сервер не дождался, когда PHP будет выполнен - ​​вы увидите ошибку 500 – KoIIIeY

+0

, так что проверьте ошибку сервера, а не PHP – KoIIIeY

+0

Я пользуюсь услугами веб-хостинга, поэтому у меня нет доступа к реальной сети сервер. Журнал ошибок сервера пуст (кроме некоторых несвязанных ошибок «Преждевременный конец скриптовых заголовков»). В соответствии с обслуживанием клиентов максимальный размер файла отсутствует (можно заархивировать каталог на моем локальном компьютере, загрузить zip-файл на сервере) и максимальное время выполнения. – MatthewS

ответ

0

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

Кредит MatthewS для этого решения.

Смежные вопросы