Альтернатива 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
, чтобы клиент мог определить, что файл не изменился.