Обслуживание загрузки больших файлов с удаленного сервера

У нас есть файлы, размещенные на RapidShare, которые мы хотели бы разместить на нашем собственном веб-сайте. В основном, когда пользователь запрашивает http://site.com/download.php?file=whatever.txt, скрипт должен передавать файл с RapidShare пользователю.

Единственное, что у меня проблемы с тем, чтобы разобраться в том, как правильно это транслировать. Я хотел бы использовать cURL, но я не уверен, что могу прочитать загрузку с RapidShare порциями, а затем передать их пользователю. Лучший способ, о котором я до сих пор думал, - это использовать комбинацию fopen, fread, повторяя часть файла пользователю, сбрасывая и повторяя этот процесс, пока весь файл не будет передан.

Я знаю о PHP readfile() функционировать так же хорошо, но будет ли это лучшим вариантом? Имейте в виду, что размер этих файлов может составлять несколько ГБ, и, хотя у нас есть серверы с 16 ГБ ОЗУ, я хочу максимально снизить использование памяти.

Спасибо за любой совет.

1 ответ

Решение

HTTP имеет заголовок с именем "Range", который в основном позволяет вам извлекать любой фрагмент файла (зная, что вы уже знаете размер файла), но, поскольку PHP не поддерживает многопоточность, я не вижу никакой выгоды от использования Это.

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

Сначала выполните потоковую передачу удаленного файла, используя fopen()/fread() (или любые функции PHP, которые позволяют вам использовать поток), разделить чтение на небольшие куски (2048 бит может быть достаточно), записать / добавить результат в tempfile(), а затем "эхом" обратно к вашему пользователю, читая временный файл.

Таким образом, даже файл 2To, по сути, потребляет 2048 битов, поскольку в памяти находится только фрагмент и дескриптор файла.

Вы также можете записать какой-нибудь прокси-менеджер в кеш и сохранить уже загруженные файлы, чтобы избежать процесса удаленного чтения, если файл загружен слишком сильно (и храните его локально в течение определенного времени).

Другие вопросы по тегам