Вы не должны использовать HTTP для этой задачи. Возможно, вы заметили, что все службы «блокировщика файлов» (и другие, которые включают загрузку файлов, например онлайн-музыкальный сервис Apple) предоставляют вам программу «загрузки», а не использование браузера. Для этого есть причины.
Во-первых, накладные расходы на кодирование передачи велики. Вы берете свои (предположительно двоичные) данные, и Base64 кодирует их; это 33% накладных расходов. Так что если для HTTP потребуется четыре часа, то для двоичного протокола потребуется только три - и это не учитывает накладные расходы на частичную передачу, поэтому реальность, вероятно, более серьезна.
Во-вторых, нет способа «возобновить» загрузку в HTTP. Поэтому, если ваше соединение разорвано, вам придется либо написать код для конкретного приложения, чтобы обработать возобновление, либо начать все сначала.
В-третьих, HTTP-серверы не предназначены для сверхдлительных соединений: они обычно имеют ограниченный или небольшой пул рабочих для обслуживания (обычно в начале секунды) клиентских запросов, а иногда они имеют небольшие ограничения на размер данных запроса (обычно 2 ГБ, а в PHP по умолчанию всего несколько МБ).
Я настоятельно рекомендую использовать протокол передачи файлов для передачи файлов (например, FTP). Вам не нужно выдавать одну пару имя пользователя / пароль всем: у вас может быть привратник, который интегрируется с любой системой аутентификации, которая у вас уже есть. FTP-over-TLS также существует и является относительно зрелым.
Существует довольно хорошее обобщение различий между двумя протоколами здесь . Обратите внимание, что в силу ваших обстоятельств вы ничего не получите от перечисленных преимуществ HTTP.
Не считайте себя ограниченным FTP - rsync также является отличным протоколом для передачи файлов, особенно если вы изменяете только часть файла (он даже выполняет двоичные дельты!). git также может эффективно переносить большие капли по защищенным соединениям или даже по HTTP, если вы настаиваете на этом.