Xpoint
   [напомнить пароль]

Докачка zip-архивов, генерируемых скриптом

Метки: [без меток]
[удл]
2007-11-12 12:30:39 [обр] Андрей Анатольич+(0/46)[досье]

Есть perl-скрипт, который заворачивает директорию с файлами в zip-архив (без компрессии) и отдает этот архив в STDOUT.

Так вот, возникла необходимость указывать content-length для скачиваемых архивов (чтобы была возможность докачки). У меня возникло 2 варианта решения проблемы:

  • Сначала архивировать директорию в памяти, брать размер архива и устанавливать заголовок и только потом отдавать в STDIN (я использую Archive::Zip, сейчас он отдает в поток сразу же).
  • Использовать какой-нибудь модуль для веб-сервера, который бы всё делал сам (если таковой модуль существует в природе).

Подскажите, в каком направлении рыть. Какой вариант лучше? Как бы это сделали вы?
Буду рад любым комментариям и предложениям.

спустя 27 минут [обр] Алексей Севрюков(13/1280)[досье]
Андрей Анатольич[досье] А вопрос о том что ZIP архив можно просто кэшировать не обсуждается? Т.е. Вы пакуете исключительно динамический контент?
спустя 1 час 9 минут [обр] Андрей Анатольич+(0/46)[досье]
Алексей Севрюков[досье] Нет, почему же. Это тоже вариант. Однако, информации, которая нуждается в архивировании — порядка 300Тб. Придется докупать нехилый дисковый массив. Хотелось бы решить проблему малой кровью ). Но если не удастся — тогда один выход, это кэширование на диске.
спустя 1 час [обр] Алексей Севрюков(13/1280)[досье]
Андрей Анатольич[досье] Ну кэш файлы не обязательно хранить пожизненно. Вы можете скидывать архив на диск, хранить сутки, например и затем удалять. Тогда если пользователей не очень много — особо много места это занимать не будет. Архивировать в памяти - тот же самый временный кэш, только если пользователей много то памяти явно на всех не хватит.
спустя 19 часов [обр] Дмитрий(0/4)[досье]

Для обеспечения докачки не достаточно наличия заголовка Content-length. Нужно, чтобы скрипт, формирующий архив умел работать с заголовками, определяющими требуемый диапазон запрашиваемого среза архива.
Также нужны заголовки Last-Modified и E-Tag, с тем, чтобы менеджеры понимали, что докачивают тот же файл, что начали качать.

Кэшировать архив придется 100%, иначе возможна ситуация, что после запуска очередного треда докачки архив окажется другим и скаченный контент окажется битым

спустя 32 минуты [обр] Андрей Анатольич+(0/46)[досье]

Алексей Севрюков[досье]
Дмитрий[досье]

Спасибо. Значит, насколько я понял — ужимаем данные в файл на диске и потом отдаем его. Через определенные промежутки времени робот удаляет устаревшие архивы (которые меньше всего качают), если размер кэша > N. Отдавать, наверно, лучше внутренним редиректом (Чтобы не пришлось работать с заголовками)?

Хотя как с ними работать ясно (благодаря полезной статье на xpoint).

спустя 2 часа 23 минуты [обр] Алексей Севрюков(13/1280)[досье]
Андрей Анатольич[досье] Да, внутренний редирект наиболее удобный вариант, т.к. при это не будет висеть Perl процесс и занимать драгоценную память при отдаче этого контента.
спустя 5 дней [обр] Андрей Анатольич+(0/46)[досье]
Алексей Севрюков[досье] Спасибо за совет.
Powered by POEM™ Engine Copyright © 2002-2005