Ограничение размера распаковываемого файла shell_exec

Я использую приведенный ниже код для загрузки zip-файла с другого сервера, который содержит более 1000 изображений. Исходный zip-файл загружается и создается/копируется на мой сервер, но код, кажется, останавливается на этом этапе. Эхо-выход из if else ниже даже не отображается.

Первоначально я установил CURLOPT_TIMEOUT на 240, но этого было недостаточно. Я бы получил ошибку тайм-аута завитка. Поскольку размер zip-файла составляет около 100 МБ, я подумал, что это займет около 15 минут. Поэтому я установил для CURLOPT_TIMEOUT значение 1200, поскольку размер исходного почтового индекса будет меняться изо дня в день.

Есть идеи, почему он перестает работать? Есть ли настройка, которую нужно изменить?

$source_photos_file = 'source_photos_file.zip';
$curl = curl_init();
$destination_photos_file = fopen($_SERVER['DOCUMENT_ROOT'].'/files/photos.zip', 'w');

curl_setopt($curl, CURLOPT_URL, FTP_URL.$source_photos_file); #input
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_TIMEOUT, 1200);
curl_setopt($curl, CURLOPT_FILE, $destination_photos_file); #output

if (curl_exec($curl) === false)
{
    echo '<p>Curl error: ' . curl_error($curl). ' - error # '.curl_errno($curl).'</p>';
}
else
{
    echo '<p>Done without any errors</p>';
}

curl_close($curl);
fclose($destination_photos_file);

$photos_unzip_result = shell_exec('unzip -P password '.$_SERVER['DOCUMENT_ROOT'].'/files/photos.zip -d '.$_SERVER['DOCUMENT_ROOT'].'/files/pics_test/');

person spiderling    schedule 16.12.2012    source источник
comment
Вы смотрели в журнал вашего веб-сервера?   -  person Olaf Dietsche    schedule 16.12.2012
comment
Это делается в cron? Если это так, вы, вероятно, должны знать, что есть намного лучшие инструменты для использования здесь, чем PHP. Все это можно сжать в двухстрочный сценарий оболочки.   -  person Charles    schedule 16.12.2012
comment
У вас опечатка в fclose.   -  person Olaf Dietsche    schedule 16.12.2012
comment
Олаф - ошибок нигде не найти. Я проверил различные журналы и ничего. Чарльз: В конечном итоге это будет сделано в cron. Если возможно заставить это работать с помощью сценария оболочки, я открыт для этого, чтобы заставить его работать. Однако у меня есть несколько других zip-файлов, которые загружаются и извлекаются. Некоторые из них представляют собой файлы данных, которые вставляются в таблицу базы данных.   -  person spiderling    schedule 16.12.2012


Ответы (1)


Посмотрите внимательнее, что вы на самом деле здесь делаете. Помимо устранения основных неполадок, таких как регистрация ошибок на самом высоком уровне и следование журналу ошибок, посмотрите, что вы на самом деле делаете:

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);    

Вы явно указываете curl вернуть загрузку, это означает, что она скопирована в память. Отключите эту опцию, особенно если вы уже указали выходной файл.

Я не могу сказать, решит ли это вашу проблему, однако я надеюсь, что это будет полезно. Ведите надлежащую регистрацию ошибок и предоставляйте конкретную информацию об ошибках, такую ​​как уведомления, предупреждения и ошибки.

person hakre    schedule 16.12.2012
comment
Это не сработало, к сожалению. Я проверил все журналы, которые я могу придумать, и включил все отчеты об ошибках, и никаких ошибок не регистрируется и не отображается. Как я упоминал выше, эхо-вывод оператора if else даже не отображается после создания целевого zip-файла. Оператор if else и эхо $photos_unzip_result отображаются при работе с другими меньшими zip-файлами. Следующий размер после 100 МБ составляет около 15 МБ. - person spiderling; 16.12.2012
comment
вы можете включить многословие и напрямую войти в STDERR/STDOUT (без временного хранения и перемотки) для curl. Ты сделал это? Сравните с stackoverflow.com/a/9707622/367456. - person hakre; 16.12.2012
comment
Хакре спасибо. Наконец-то я получил STDERR для записи в файл. Заменил оператор if else в моем коде только на curl_exec($curl). Любые эхо-сигналы после этой строки не отображаются, и ошибок не возникает. Подробности в файле также не содержат ошибок. Он показывает соединение и команды для перехода в каталог, где находится нужный мне файл. Извлекает файл, завершает передачу и закрывает соединение. Очевидно, проблема связана с размером zip-файла, который я пытаюсь загрузить и скопировать, потому что у меня нет этой проблемы с zip-файлами меньшего размера. Отсутствие ошибок расстраивает. - person spiderling; 17.12.2012
comment
В итоге воспользовался предложением Чарльза. У меня есть сценарий оболочки, который получает файлы с помощью «wget» и распаковывает их с помощью «unzip». Затем у меня есть сценарий оболочки, вызывающий сценарий PHP для запуска вставки и обновления базы данных на основе определенных условий. Всем спасибо. - person spiderling; 19.12.2012
comment
Да, ракушечник. Часто намного быстрее и гибче, чем кодирование PHP-скриптов, особенно для обработки данных. - person hakre; 19.12.2012