yii отдача динамического файла

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

yii отдача динамического файла

Сообщение zibert02 »

есть ли готовое решение? т.е. передается в акшщин ид файла, и он отдает файл. нужно учесть докачку
пробовал искать в инете, но не находит
видел готовые решения на чистом пхп, но сперва уточню может есть именно решение под yii?

maschingan
Сообщения: 75
Зарегистрирован: 2011.01.20, 23:52

Re: yii отдача динамического файла

Сообщение maschingan »

Недавно читал вот эту статейку в wiki но до конца не разобрался как это работает и не пробовал, поскольку не было необходимости, но Вы возможно найдете в ней что-нибудь интересное.

zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

Re: yii отдача динамического файла

Сообщение zibert02 »

а как под него nginx настроить?


youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: yii отдача динамического файла

Сообщение youroff »

Очень интересная тема. Кто-нибудь владеет статистикой по поводу того, как нагружается сервер при обилии обращений за тяжелыми файлами?
У меня дилемма -- либо юзать свой сервер для хранения файлов, либо подключить облачное хранилище.
Прежде всего хочется, чтобы скорость самого приложения не страдала. Но есть ряд проблем:
- Amazon S3 оказался тормозом. Может он и развернется во всю ширь, если юзать его в совокупности с их же фирменным CDN, но при попытке залить файлик в бакет и выкачать его напрямую я вижу скорость 400 килобит в секунду (при канале 20мбит). И это справедливо при подключении из разных точек.
- Вторая проблема в том, что мне нужно по запросу собирать файлы в архив и отдавать их одним файлом. Тесты показали, что zip с уровнем компрессии 0 практически эквивалентен простым файловым операциям, однако никто из облачников такую функцию не предлагает из коробки. С амазоном я хотел использовать инстанс EC2 для обработки запросов и упаковки, но позже обнаружил еще одно облачное хранилище Nirvanix, у которых в API есть куча функций для обработки фото/аудио/видео. Сейчас веду с ними переговоры о добавлении "zip-on-fly" в API, но есть смутное подозрение, что вряд ли они захотят это делать какого-то мелкого клиента из России. Так вот у Nirvanix есть датацентр в Германии, так что они могут быть пошустрее амазона.

В общем, если отдача файлов грузит сервер умеренно, я готов плюнуть на облачные сервисы пока... Кто-нибудь может пролить свет на этот вопрос?

Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: yii отдача динамического файла

Сообщение Svyatov »

youroff, не хватает конкретики. Насколько тяжелые файлы? Сколько обращений в секунду? Что значит "грузить умеренно"?

youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: yii отдача динамического файла

Сообщение youroff »

Конкретики пока и нет, проект в разработке.
Но предварительно это файл 10-50 Мб, который может захотеть скачать одновременно (+- 5-10 мин) около 200 человек.
Грузить умеренно -- это значит, что процесс отдающий файлы не затыкает php и базу. Т.е. как бы так сделать, чтобы допустим скорость выдачи понижалась, а сайт продолжал работать? Есть какие-то инструменты балансировки?

Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: yii отдача динамического файла

Сообщение Svyatov »

youroff писал(а):Конкретики пока и нет, проект в разработке.
Но предварительно это файл 10-50 Мб, который может захотеть скачать одновременно (+- 5-10 мин) около 200 человек.
Грузить умеренно -- это значит, что процесс отдающий файлы не затыкает php и базу. Т.е. как бы так сделать, чтобы допустим скорость выдачи понижалась, а сайт продолжал работать? Есть какие-то инструменты балансировки?
Я бы больше волновался о канале, а не сервере. Резать скорость можно nginx.

youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: yii отдача динамического файла

Сообщение youroff »

Ну гигабит -- это как раз в идеальном случае 200 клиентов, тянущие по 5 мбит... меня в этом сценарии беспокоит файловая. У нас в серваке стоит два обычных SATA-диска (рейд едишн вроде бы, не помню) в Raid 1, стало быть скорость чтения у них... ну 80-90 Мб/с, если файл лежит аккуратной кучкой. Вот что будет, если все захотят резко скачать один файл? Наверняка есть какое-то кэширование встроенное? А если файлы разные?

Впрочем, я кажется понял, что гадать тут бесполезно: надо проверять. Просто хотелось перестраховаться...

Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: yii отдача динамического файла

Сообщение Svyatov »

youroff писал(а):Ну гигабит -- это как раз в идеальном случае 200 клиентов, тянущие по 5 мбит... меня в этом сценарии беспокоит файловая. У нас в серваке стоит два обычных SATA-диска (рейд едишн вроде бы, не помню) в Raid 1, стало быть скорость чтения у них... ну 80-90 Мб/с, если файл лежит аккуратной кучкой. Вот что будет, если все захотят резко скачать один файл? Наверняка есть какое-то кэширование встроенное? А если файлы разные?

Впрочем, я кажется понял, что гадать тут бесполезно: надо проверять. Просто хотелось перестраховаться...
Реальность все расставит по своим местам, подстраховаться тут не получится особо, имхо. Если нужно избежать затыков винтов, то стоит смотреть в сторону увеличения RAM и файловых систем в памяти, типа tmpfs.

youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: yii отдача динамического файла

Сообщение youroff »

Памяти я собираюсь под запуск напихать 12 Гб, но что делать с файловой системой в памяти? Держать там все файлы -- не хватит никакой памяти. Использовать как кэш? Ну так это нужен какой-то механизм, который будет туда класть наиболее затребуемые файлы. Есть что-то подобное на примете?

nite2006
Сообщения: 24
Зарегистрирован: 2010.11.22, 17:01

Re: yii отдача динамического файла

Сообщение nite2006 »

Чтобы отдавать файл использовать tmpfs? Бредовая мысль.
xsendfile у меня нормально отдавал _динамически_ сгенеренные_ (ссылки) файлы при 600-800 _одновременных_ коннектах в секунду даже под апачем без кэширующего nginx. Железка - старенький хп DL380.
Механизм для загрузки во временное? Ссылки на файл в бд же лежат и общедоступные линки генеряться динамически? Так счетчики воткнуть(лучше триггерами в бд) и поле добавить булеан, что файл лежит в другом месте; еще можно одновременное количество запросов считать средствами самого веб сервера и переносить файл при достижении критической нагрузки в нужное место, только смысла отдавать так быстро контент вроде не видно. Да и обычный кэш (если разговор про yii) никто не отменял. Да и мысль уменьшения нагрузки и ваша фраза "процесс отдающий файлы не затыкает php и базу" никак не связываются. Логично, что пхп генерит ссылку на файл для пользователя а все остальное уже дело модуля веб-сервера, если вы будете отдавать все файлы через пхп, то у вас естественно, будет висеть куча процессов тупо читающих файл и отдающих пользователю.

nite2006
Сообщения: 24
Зарегистрирован: 2010.11.22, 17:01

Re: yii отдача динамического файла

Сообщение nite2006 »

Вдогонку.
На амазоне можно инстансы запускать и в европе, конечно если вы хотите "халявный" микроинстанс запустить, то это возможно только в штатах. C S3 сам еще разбираюсь, но как-то привычка держать все свое на своих же машинах укоренилась очень сильно в нашем сознании :) Из плюсов S3 стабильно в пределах облака (сша или европа)

youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: yii отдача динамического файла

Сообщение youroff »

Что-то я запутался... Вы говорите, что отдавать через tmpfs -- бред, но предлагаете вполне толковое решение для перекладывания туда файла. Или я что-то не так понял? Для случая, что самые свежие файлы будут просить чаще всего, вполне разумно раздавать их из рамдиска, хотя бы даже исходя из ресурса HDD... разве нет?

Когда я говорил о незатыкании пхп и базы -- имел в виду общее разделение ресурсов. Я, честно говоря, не специалист в линуксе и не представляю, как там делятся ресурсы, и может ли некий процесс захавать 99% CPU, что все остальное просто замрет...

В целом информация ободряющая, спасибо!
А кстати, это вообще нормальное явление, что Амазон S3 такой тормоз или я просто что-то не то с ним делал?

Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: yii отдача динамического файла

Сообщение RSol »

maschingan писал(а):Недавно читал вот эту статейку в wiki но до конца не разобрался как это работает и не пробовал, поскольку не было необходимости, но Вы возможно найдете в ней что-нибудь интересное.
Только что перевел ее
http://sed-story.ru/blog/saitostroenie/21.html

Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: yii отдача динамического файла

Сообщение Svyatov »

nite2006 писал(а):Чтобы отдавать файл использовать tmpfs? Бредовая мысль.
xsendfile у меня нормально отдавал _динамически_ сгенеренные_ (ссылки) файлы при 600-800 _одновременных_ коннектах в секунду даже под апачем без кэширующего nginx. Железка - старенький хп DL380.
Весом по 10-50 Мб? Не верю.

nite2006
Сообщения: 24
Зарегистрирован: 2010.11.22, 17:01

Re: yii отдача динамического файла

Сообщение nite2006 »

Архивы и картинки jpg gif tiff bmp, соответственно размер от 8Мб до 60 где-то, т.к. там сканы уставных документов, лицензии на строительство и др. Как только тендер выкладывается идет огромный наплыв на скачку информации. Отдавали уже правда модулем и резали скорость, ничего критично зависающего не было. С т.з. защиты конечно не особо, т.к. сессия висела с пару минут и потом ссылка обнулялась если не шло дальнейшей загрузки или обновлялась, если загрузка еще не закончена.

Описал решение, т.к. в вашем случае оно может и сработает. Тем более никаких особых затрат на его создание не нужно, но оперативку все же лучше использовать по прямому назначению. Если уж совсем решилсь то можно купить спец плату воткнуть в нее оперативки и сделать ram-жесткий диск. Ситуация вполне рабочая и проверялась мной, правда под виндой с перепроведением базы 1с 7.7

Разумнее раздавать их с рейда, он увеличит скорость т.к. там есть "железный" кеш.

Да S3 тормозит по сравнению с обычным сервером.

Аватара пользователя
mihan007
Сообщения: 31
Зарегистрирован: 2011.01.28, 11:05
Откуда: Санкт-Петербург
Контактная информация:

Re: yii отдача динамического файла

Сообщение mihan007 »

возможно вот это расширение будет полезно: http://www.yiiframework.com/extension/edownloadhelper/
с уважением,
Куклин Михаил

контакты: +79313601666 | mihan007@ya.ru | https://paradox777.ru

youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: yii отдача динамического файла

Сообщение youroff »

Что-то не пойму с X-Accel-Redirect...
Если верить мануалу к CHttpRequest->xSendFile() посылать надо физическое место физического расположения файла, однако дальше написано, что в настройках нжинкса надо прописать локейшн с директивой internal, который будет тоже прослойкой.
Вот для этого примера как надо прописать локейшн?

Код: Выделить всё

Yii::app()->request->xSendFile('/home/user/Pictures/picture1.jpg',array(
   'saveName'=>'RequestedFile.jpg',
   'mimeType'=>'image/jpeg',
   'terminate'=>false,
));
 
UPD: Ну да, вроде подразобрался... надо бы в мануал внести пояснения.
В общем, в xSendFile надо путь прописывать относительно локейшна, т.е.:

Код: Выделить всё

Yii::app()->request->xSendFile('/files/Pictures/picture1.jpg',array(
   'saveName'=>'RequestedFile.jpg',
));
 
И в конфиге нжинкса:

Код: Выделить всё

location /files {
                       root /home/user;
                       internal;
                   }

 
Пойду проверять :)

youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: yii отдача динамического файла

Сообщение youroff »

Нифига не работает :( Нигде не могу найти -- X-Accel-Redirect -- это вообще отдельная фича или родная функция nginx?
Чо-то все настроил вроде как положено, но в результате -- полная тишина. Даже в логах что-то ничего нет.

Ответить