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

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

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

Предисловие.

Мне нужно организовать докачку zip-архивов, генерируемых скриптом. (Докачка zip-архивов, генерируемых скриптом)

Далее.

Сейчас скрипт архивирует данные "на лету" и сразу отдает их в STDOUT, то есть клиенту не нужно ждать, пока данные архивируются — окно "Сохранить как" открывается у него сразу.
Другое дело — когда нужна докачка. Я подумал, и решил сделать так:

  1. Если от клиента приходят заголовки означающие, что он хочет докачать файл — мы архивируем файл (если он уже не закэширован на файлсистеме), сохраняем его на диск и делаем внутренний редирект на этот файл. В этом случае клиенту придется подождать, пока файл архивируется.
  2. Если клиент просто хочет скачать файл (не посылает заголовки для докачки) — архивируем на лету и сразу отдаем в поток.
  3. И, соответственно, что следует из первого пункта — если запрашиваемый файл уже закэширован, то просто отдаем его внутренним редиректом.

То есть ждать придется только тому пользователю, который первым пытается скачать еще не кэшированный архив.

ВОПРОСЫ:

  • Хорошо ли так делать, как написано в пункте 1? Есть ли здесь подводняе камни?
  • Какие заголовки приходят, когда клиент хочет докачать файл? И какие при этом заголовки должен отдавать сервер?
спустя 52 минуты [обр] GRAy(2/259)[досье]
Андрей Анатольич[досье] А скрипт не может отдавать поток клиенту и параллельно писать архив на диск?
спустя 52 минуты [обр] Андрей Анатольич+(0/46)[досье]
GRAy[досье] Пробовал. Использовал ZIP::Archive, не получилось. Если пишем в файл, то скрипт дожидается, когда будет записан файл и только потом отдает данные в поток. Может и можно как-то сделать, но я пока не знаю.
спустя 1 час 56 минут [обр] arto(3/494)[досье]
perldoc -f fork
плюс синхронизация какая-либо
хотя, по уму, надо отдавать размер архива в заголовке.
спустя 3 минуты [обр] Fd(0/35)[досье]
threads::shared ?
P.S. IMHO, жать на лету - не есть хорошо. Если оглянуться вокруг, то можно заметить, что большинство сервисов сначала генерируют контент, потом дают временную сслыку на него. Ссылка живет так с несколько дней, за это время, очевидно, что человек должен успеть скачать файл. Да и докачать тоже будет возможно.
спустя 2 дня 15 часов [обр] Андрей Анатольич+(0/46)[досье]
Fd[досье] Жаться на лету будет только один раз — в дальнейшем архив будет браться из кэша. А иначе, конечно, получится фигня.
спустя 1 час 3 минуты [обр] Fd(0/35)[досье]
Ну тогда, действительно, либо fork, либо threads. Вот, например.
спустя 6 минут [обр] Алексей Севрюков(13/1280)[досье]
Если пишем в файл, то скрипт дожидается, когда будет записан файл и только потом отдает данные в поток

Андрей Анатольич[досье] Ну и что? На диск Вы его сохранили один раз, а потом только читаете. Вообще я за вариант:

  1. Приходит запрос, проверяем есть ли контент в кэше.
  2. Если контента в кэше нет, то он пишется на диск и дается ссылка на него.

Да, при первичной генерации контента скрипт будет отрабатывать долго, зато потом все будет быстро. И, как было сказано выше, Вам не придется думать вообще. Apache всю докачку организует сам.

Powered by POEM™ Engine Copyright © 2002-2005