Альтернатива x-sendfile для Apache для загрузки огромных файлов с поддержкой резюме

Мне нужно программно инициировать загрузку файлов с помощью PHP вместе с поддержкой возобновления

Эти файлы тяжелые. Таким образом, буферизация ввода-вывода, например, ниже или кеширование, не является вариантом

$content=file_get_contents($file);
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header("Content-Length: ". filesize($file));
echo $content;

Единственный жизнеспособный вариант, который я нашел до сих пор, - это модуль X-sendfile модуля Apache. К сожалению, наша служба хостинга не установит mod_xsendfile - поэтому мы ищем других хостинг-провайдеров, но это другая история.

Мы используем LAMP и структуру yii. Каковы возможные альтернативы?

Ответы

Ответ 1

Будут ли ваши хосты позволять вам установить что-то вроде Perlbal (http://www.danga.com/perlbal/) в качестве прокси-сервера перед apache?

Perlbal позволяет вам загружать файлы с помощью очень похожего подхода к x-sendfile (используя X-REPROXY-URL:/path/to/a/local/file.jpg), и это довольно высокопроизводительный, (LiveJournal и Flickr используют (d) это.  Тем не менее, вам потребуется запустить apache на другом порту и запустить perlbal на порт 80, который может не понравиться хостинг-провайдеру. Конечно, вы могли бы сделать то же самое с чем-то вроде nginx, если бы вам не понравилось perlbal.

Ответ 2

Вы можете подражать этому, прочитав заголовки запросов и выведите содержимое с шагом 4kb с помощью fopen, fseek, fread и так далее. См. Также возможные заголовки запросов здесь. Вы также должны реализовать ETag, чтобы клиент мог определить, что файл не изменился.