Пропускная способность загрузки файлов PHP - PullRequest
0 голосов
/ 11 февраля 2012

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

Я уже установил тайм-аут для загрузки файла, изменив тайм-аут соединения в настройках своего сайта в IIS - таким образом, файл продолжает загружаться до шести часов (-_-) - но здесь я сталкиваюсь с моим текущим проблема - это может занять шесть часов!

После того, как процесс загрузки прошёл около 10% или около того (для файла размером 300 мегабайт), я заметил, что файл продолжает увеличиваться, но моя скорость загрузки, похоже, «падает» - как я заметил, быстрее, когда я начал передачу, чем я вижу на полпути через нее. Числа здесь не обязательно актуальны, так как я знаю, что моя загрузка (пока я загружаю, все еще 2 Мбит / с) способна выдавать быстрее, чем она есть, и сервер на другом конце находится на оптоволокне.

Интересно, сталкивался ли кто-нибудь с этим раньше, и если да, то определили ли вы обходной путь. Любая помощь приветствуется. Спасибо.

1 Ответ

3 голосов
/ 11 февраля 2012

Вы не должны использовать HTTP для этой задачи. Возможно, вы заметили, что все службы «блокировщика файлов» (и другие, которые включают загрузку файлов, например онлайн-музыкальный сервис Apple) предоставляют вам программу «загрузки», а не использование браузера. Для этого есть причины.

Во-первых, накладные расходы на кодирование передачи велики. Вы берете свои (предположительно двоичные) данные, и Base64 кодирует их; это 33% накладных расходов. Так что если для HTTP потребуется четыре часа, то для двоичного протокола потребуется только три - и это не учитывает накладные расходы на частичную передачу, поэтому реальность, вероятно, более серьезна.

Во-вторых, нет способа «возобновить» загрузку в HTTP. Поэтому, если ваше соединение разорвано, вам придется либо написать код для конкретного приложения, чтобы обработать возобновление, либо начать все сначала.

В-третьих, HTTP-серверы не предназначены для сверхдлительных соединений: они обычно имеют ограниченный или небольшой пул рабочих для обслуживания (обычно в начале секунды) клиентских запросов, а иногда они имеют небольшие ограничения на размер данных запроса (обычно 2 ГБ, а в PHP по умолчанию всего несколько МБ).

Я настоятельно рекомендую использовать протокол передачи файлов для передачи файлов (например, FTP). Вам не нужно выдавать одну пару имя пользователя / пароль всем: у вас может быть привратник, который интегрируется с любой системой аутентификации, которая у вас уже есть. FTP-over-TLS также существует и является относительно зрелым.

Существует довольно хорошее обобщение различий между двумя протоколами здесь . Обратите внимание, что в силу ваших обстоятельств вы ничего не получите от перечисленных преимуществ HTTP.

Не считайте себя ограниченным FTP - rsync также является отличным протоколом для передачи файлов, особенно если вы изменяете только часть файла (он даже выполняет двоичные дельты!). git также может эффективно переносить большие капли по защищенным соединениям или даже по HTTP, если вы настаиваете на этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...