Одной из обязанностей моего приложения Rails является создание и обслуживание подписанных xmls. Любой подписанный xml, после его создания, никогда не изменяется. Поэтому я храню каждый xml в папке public
и перенаправляю клиента надлежащим образом, чтобы избежать ненужной обработки с контроллера.Обслуживание динамических zip-файлов через Apache
Теперь я хочу новую функцию: каждый xml связан с датой, и я хотел бы реализовать возможность обслуживать сжатый файл, содержащий каждый xml, дата которого находится в периоде, указанном клиентом. Тем не менее, этот период не может быть ограничен менее чем одним месяцем, чтобы функция была полезной, и это означает, что некоторые файлы zip, которые будут обслуживаться, будут такими же большими, как 50M.
Мое приложение развернуто как пассажирский модуль Apache. Таким образом, совершенно неприемлемо обслуживать файл с send_data
, так как клиенту придется ждать, пока весь сжатый файл будет создан до начала фактической загрузки. Хотя у меня есть идея о том, как реализовать эту функцию в Rails, поэтому сжатый файл создается , пока он обслуживается. Я чувствую, что мой сервер будет работать на ресурсах, как только некоторые длинные процессы Ruby/Passenger будут распределены для обслуживания больших zip-файлов.
Я читал о a better solution, чтобы обслуживать статические файлы через Apache, но не динамические.
Итак, в чем проблема? Нужно ли мне что-то вроде пользовательского обработчика Apache? Как сообщить Apache из моего приложения, как обрабатывать запрос, сжимать файлы и передавать результат одновременно?
Индекс формата файла ZIP в конце файла. Кроме того, я быстро просмотрел RFC 2616 (HTTP 1.1) и ответ переменной длины, который, вероятно, работает, хотя обычно должна быть объявлена длина контента. Технически это должно быть возможно, насколько я могу судить. – erloewe
Нет проблемы с HTTP, когда вы заранее не знаете длину, это то, для чего предназначена кодировка передачи. Вы можете писать байты, которые выглядят как zip-файл на любом языке, просто обязательно периодически очищайте свой вывод. – covener