Я разрабатываю сервис загрузки файлов для моей компании. Наши пользователи часто отправляют нам очень большие файлы .zip, заполненные очень большими файлами иллюстраторов. Обычно размер файлов не превышает 1,5 ГБ, но мне нужно планировать обработку файлов объемом до 4 ГБ.
Очевидно, что это вызывает много проблем, связанных с тем, как я настраиваю свой Apache, чтобы разрешать такие большие передачи файлов, не перегружая мой сервер и не открывая дыры в безопасности.
Концерн 1: ограничения памяти
Одной из особенностей моей системы является то, что пользователи должны иметь возможность загружать свои файлы обратно после их загрузки. Я избегал использовать стандартную загрузку (просто ссылку на файл) из-за проблем безопасности - я не могу позволить другим пользователям загружать файлы друг друга. Мое решение состояло в том, чтобы сохранить загруженные файлы в защищенном каталоге за пределами корневого каталога www и загрузить их с помощью сценария PHP. Этот PHP-скрипт выглядит примерно так:
$fo = fopen($uploadDir.$file_name, "r");
while(!feof($fo)) {
$strang = fread($fo, 102400);
echo $strang;
ob_flush();
}
fclose($fo);
Я поместил фред в цикл и заблокировал его загрузкой только небольших кусков файла за раз. Я сделал это, потому что мой сервер имеет только 4 ГБ ОЗУ и должен иметь возможность обрабатывать одновременную загрузку нескольких человек (вероятно, максимум 20 человек). Мой первый вопрос - насколько большой кусок я должен читать за раз. В настоящее время загрузка файла объемом 1,5 ГБ мучительно медленная из-за такого размера фрагмента.
Концерн 2: Максимальное время выполнения
Другая проблема загрузки / скачивания таких больших файлов - максимальное время выполнения. Хотя в моей внутренней сети все довольно быстро, я должен быть готов к пользователям с медленными подключениями. Я устанавливаю низкую скорость загрузки на 1 Мбит / с, что составляет около 35 минут для загрузки. Давайте будем щедрыми и скажем, что они могут загружать с удвоенной скоростью, так что 15 минут для загрузки.
Это угроза безопасности - установить для max_excution_time значение 30 минут? Это собирается убить что-нибудь на моем сервере? У меня нет никаких причин думать, что это плохая идея, но моя интуиция просто кричит, что я был бы глуп, чтобы позволить скрипту так долго работать. Есть ли лучший способ сделать то, что я пытаюсь сделать?
Я видел пару других похожих вопросов, и большинство из них предлагали использовать что-то вроде java или silverlight. Я хотел бы, если есть какой-либо разумный способ, чтобы избежать Java. В настоящее время я использую swfupload и сопровождающий плагин jQuery.