yii отдача динамического файла
yii отдача динамического файла
есть ли готовое решение? т.е. передается в акшщин ид файла, и он отдает файл. нужно учесть докачку
пробовал искать в инете, но не находит
видел готовые решения на чистом пхп, но сперва уточню может есть именно решение под yii?
пробовал искать в инете, но не находит
видел готовые решения на чистом пхп, но сперва уточню может есть именно решение под yii?
-
- Сообщения: 75
- Зарегистрирован: 2011.01.20, 23:52
Re: yii отдача динамического файла
Недавно читал вот эту статейку в wiki но до конца не разобрался как это работает и не пробовал, поскольку не было необходимости, но Вы возможно найдете в ней что-нибудь интересное.
Re: yii отдача динамического файла
а как под него nginx настроить?
-
- Сообщения: 75
- Зарегистрирован: 2011.01.20, 23:52
Re: yii отдача динамического файла
Очень интересная тема. Кто-нибудь владеет статистикой по поводу того, как нагружается сервер при обилии обращений за тяжелыми файлами?
У меня дилемма -- либо юзать свой сервер для хранения файлов, либо подключить облачное хранилище.
Прежде всего хочется, чтобы скорость самого приложения не страдала. Но есть ряд проблем:
- Amazon S3 оказался тормозом. Может он и развернется во всю ширь, если юзать его в совокупности с их же фирменным CDN, но при попытке залить файлик в бакет и выкачать его напрямую я вижу скорость 400 килобит в секунду (при канале 20мбит). И это справедливо при подключении из разных точек.
- Вторая проблема в том, что мне нужно по запросу собирать файлы в архив и отдавать их одним файлом. Тесты показали, что zip с уровнем компрессии 0 практически эквивалентен простым файловым операциям, однако никто из облачников такую функцию не предлагает из коробки. С амазоном я хотел использовать инстанс EC2 для обработки запросов и упаковки, но позже обнаружил еще одно облачное хранилище Nirvanix, у которых в API есть куча функций для обработки фото/аудио/видео. Сейчас веду с ними переговоры о добавлении "zip-on-fly" в API, но есть смутное подозрение, что вряд ли они захотят это делать какого-то мелкого клиента из России. Так вот у Nirvanix есть датацентр в Германии, так что они могут быть пошустрее амазона.
В общем, если отдача файлов грузит сервер умеренно, я готов плюнуть на облачные сервисы пока... Кто-нибудь может пролить свет на этот вопрос?
У меня дилемма -- либо юзать свой сервер для хранения файлов, либо подключить облачное хранилище.
Прежде всего хочется, чтобы скорость самого приложения не страдала. Но есть ряд проблем:
- Amazon S3 оказался тормозом. Может он и развернется во всю ширь, если юзать его в совокупности с их же фирменным CDN, но при попытке залить файлик в бакет и выкачать его напрямую я вижу скорость 400 килобит в секунду (при канале 20мбит). И это справедливо при подключении из разных точек.
- Вторая проблема в том, что мне нужно по запросу собирать файлы в архив и отдавать их одним файлом. Тесты показали, что zip с уровнем компрессии 0 практически эквивалентен простым файловым операциям, однако никто из облачников такую функцию не предлагает из коробки. С амазоном я хотел использовать инстанс EC2 для обработки запросов и упаковки, но позже обнаружил еще одно облачное хранилище Nirvanix, у которых в API есть куча функций для обработки фото/аудио/видео. Сейчас веду с ними переговоры о добавлении "zip-on-fly" в API, но есть смутное подозрение, что вряд ли они захотят это делать какого-то мелкого клиента из России. Так вот у Nirvanix есть датацентр в Германии, так что они могут быть пошустрее амазона.
В общем, если отдача файлов грузит сервер умеренно, я готов плюнуть на облачные сервисы пока... Кто-нибудь может пролить свет на этот вопрос?
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: yii отдача динамического файла
youroff, не хватает конкретики. Насколько тяжелые файлы? Сколько обращений в секунду? Что значит "грузить умеренно"?
Re: yii отдача динамического файла
Конкретики пока и нет, проект в разработке.
Но предварительно это файл 10-50 Мб, который может захотеть скачать одновременно (+- 5-10 мин) около 200 человек.
Грузить умеренно -- это значит, что процесс отдающий файлы не затыкает php и базу. Т.е. как бы так сделать, чтобы допустим скорость выдачи понижалась, а сайт продолжал работать? Есть какие-то инструменты балансировки?
Но предварительно это файл 10-50 Мб, который может захотеть скачать одновременно (+- 5-10 мин) около 200 человек.
Грузить умеренно -- это значит, что процесс отдающий файлы не затыкает php и базу. Т.е. как бы так сделать, чтобы допустим скорость выдачи понижалась, а сайт продолжал работать? Есть какие-то инструменты балансировки?
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: yii отдача динамического файла
Я бы больше волновался о канале, а не сервере. Резать скорость можно nginx.youroff писал(а):Конкретики пока и нет, проект в разработке.
Но предварительно это файл 10-50 Мб, который может захотеть скачать одновременно (+- 5-10 мин) около 200 человек.
Грузить умеренно -- это значит, что процесс отдающий файлы не затыкает php и базу. Т.е. как бы так сделать, чтобы допустим скорость выдачи понижалась, а сайт продолжал работать? Есть какие-то инструменты балансировки?
Re: yii отдача динамического файла
Ну гигабит -- это как раз в идеальном случае 200 клиентов, тянущие по 5 мбит... меня в этом сценарии беспокоит файловая. У нас в серваке стоит два обычных SATA-диска (рейд едишн вроде бы, не помню) в Raid 1, стало быть скорость чтения у них... ну 80-90 Мб/с, если файл лежит аккуратной кучкой. Вот что будет, если все захотят резко скачать один файл? Наверняка есть какое-то кэширование встроенное? А если файлы разные?
Впрочем, я кажется понял, что гадать тут бесполезно: надо проверять. Просто хотелось перестраховаться...
Впрочем, я кажется понял, что гадать тут бесполезно: надо проверять. Просто хотелось перестраховаться...
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: yii отдача динамического файла
Реальность все расставит по своим местам, подстраховаться тут не получится особо, имхо. Если нужно избежать затыков винтов, то стоит смотреть в сторону увеличения RAM и файловых систем в памяти, типа tmpfs.youroff писал(а):Ну гигабит -- это как раз в идеальном случае 200 клиентов, тянущие по 5 мбит... меня в этом сценарии беспокоит файловая. У нас в серваке стоит два обычных SATA-диска (рейд едишн вроде бы, не помню) в Raid 1, стало быть скорость чтения у них... ну 80-90 Мб/с, если файл лежит аккуратной кучкой. Вот что будет, если все захотят резко скачать один файл? Наверняка есть какое-то кэширование встроенное? А если файлы разные?
Впрочем, я кажется понял, что гадать тут бесполезно: надо проверять. Просто хотелось перестраховаться...
Re: yii отдача динамического файла
Памяти я собираюсь под запуск напихать 12 Гб, но что делать с файловой системой в памяти? Держать там все файлы -- не хватит никакой памяти. Использовать как кэш? Ну так это нужен какой-то механизм, который будет туда класть наиболее затребуемые файлы. Есть что-то подобное на примете?
Re: yii отдача динамического файла
Чтобы отдавать файл использовать tmpfs? Бредовая мысль.
xsendfile у меня нормально отдавал _динамически_ сгенеренные_ (ссылки) файлы при 600-800 _одновременных_ коннектах в секунду даже под апачем без кэширующего nginx. Железка - старенький хп DL380.
Механизм для загрузки во временное? Ссылки на файл в бд же лежат и общедоступные линки генеряться динамически? Так счетчики воткнуть(лучше триггерами в бд) и поле добавить булеан, что файл лежит в другом месте; еще можно одновременное количество запросов считать средствами самого веб сервера и переносить файл при достижении критической нагрузки в нужное место, только смысла отдавать так быстро контент вроде не видно. Да и обычный кэш (если разговор про yii) никто не отменял. Да и мысль уменьшения нагрузки и ваша фраза "процесс отдающий файлы не затыкает php и базу" никак не связываются. Логично, что пхп генерит ссылку на файл для пользователя а все остальное уже дело модуля веб-сервера, если вы будете отдавать все файлы через пхп, то у вас естественно, будет висеть куча процессов тупо читающих файл и отдающих пользователю.
xsendfile у меня нормально отдавал _динамически_ сгенеренные_ (ссылки) файлы при 600-800 _одновременных_ коннектах в секунду даже под апачем без кэширующего nginx. Железка - старенький хп DL380.
Механизм для загрузки во временное? Ссылки на файл в бд же лежат и общедоступные линки генеряться динамически? Так счетчики воткнуть(лучше триггерами в бд) и поле добавить булеан, что файл лежит в другом месте; еще можно одновременное количество запросов считать средствами самого веб сервера и переносить файл при достижении критической нагрузки в нужное место, только смысла отдавать так быстро контент вроде не видно. Да и обычный кэш (если разговор про yii) никто не отменял. Да и мысль уменьшения нагрузки и ваша фраза "процесс отдающий файлы не затыкает php и базу" никак не связываются. Логично, что пхп генерит ссылку на файл для пользователя а все остальное уже дело модуля веб-сервера, если вы будете отдавать все файлы через пхп, то у вас естественно, будет висеть куча процессов тупо читающих файл и отдающих пользователю.
Re: yii отдача динамического файла
Вдогонку.
На амазоне можно инстансы запускать и в европе, конечно если вы хотите "халявный" микроинстанс запустить, то это возможно только в штатах. C S3 сам еще разбираюсь, но как-то привычка держать все свое на своих же машинах укоренилась очень сильно в нашем сознании Из плюсов S3 стабильно в пределах облака (сша или европа)
На амазоне можно инстансы запускать и в европе, конечно если вы хотите "халявный" микроинстанс запустить, то это возможно только в штатах. C S3 сам еще разбираюсь, но как-то привычка держать все свое на своих же машинах укоренилась очень сильно в нашем сознании Из плюсов S3 стабильно в пределах облака (сша или европа)
Re: yii отдача динамического файла
Что-то я запутался... Вы говорите, что отдавать через tmpfs -- бред, но предлагаете вполне толковое решение для перекладывания туда файла. Или я что-то не так понял? Для случая, что самые свежие файлы будут просить чаще всего, вполне разумно раздавать их из рамдиска, хотя бы даже исходя из ресурса HDD... разве нет?
Когда я говорил о незатыкании пхп и базы -- имел в виду общее разделение ресурсов. Я, честно говоря, не специалист в линуксе и не представляю, как там делятся ресурсы, и может ли некий процесс захавать 99% CPU, что все остальное просто замрет...
В целом информация ободряющая, спасибо!
А кстати, это вообще нормальное явление, что Амазон S3 такой тормоз или я просто что-то не то с ним делал?
Когда я говорил о незатыкании пхп и базы -- имел в виду общее разделение ресурсов. Я, честно говоря, не специалист в линуксе и не представляю, как там делятся ресурсы, и может ли некий процесс захавать 99% CPU, что все остальное просто замрет...
В целом информация ободряющая, спасибо!
А кстати, это вообще нормальное явление, что Амазон S3 такой тормоз или я просто что-то не то с ним делал?
- RSol
- Сообщения: 325
- Зарегистрирован: 2010.05.07, 08:36
- Откуда: Северодонецк, Украина
- Контактная информация:
Re: yii отдача динамического файла
Только что перевел ееmaschingan писал(а):Недавно читал вот эту статейку в wiki но до конца не разобрался как это работает и не пробовал, поскольку не было необходимости, но Вы возможно найдете в ней что-нибудь интересное.
http://sed-story.ru/blog/saitostroenie/21.html
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: yii отдача динамического файла
Весом по 10-50 Мб? Не верю.nite2006 писал(а):Чтобы отдавать файл использовать tmpfs? Бредовая мысль.
xsendfile у меня нормально отдавал _динамически_ сгенеренные_ (ссылки) файлы при 600-800 _одновременных_ коннектах в секунду даже под апачем без кэширующего nginx. Железка - старенький хп DL380.
Re: yii отдача динамического файла
Архивы и картинки jpg gif tiff bmp, соответственно размер от 8Мб до 60 где-то, т.к. там сканы уставных документов, лицензии на строительство и др. Как только тендер выкладывается идет огромный наплыв на скачку информации. Отдавали уже правда модулем и резали скорость, ничего критично зависающего не было. С т.з. защиты конечно не особо, т.к. сессия висела с пару минут и потом ссылка обнулялась если не шло дальнейшей загрузки или обновлялась, если загрузка еще не закончена.
Описал решение, т.к. в вашем случае оно может и сработает. Тем более никаких особых затрат на его создание не нужно, но оперативку все же лучше использовать по прямому назначению. Если уж совсем решилсь то можно купить спец плату воткнуть в нее оперативки и сделать ram-жесткий диск. Ситуация вполне рабочая и проверялась мной, правда под виндой с перепроведением базы 1с 7.7
Разумнее раздавать их с рейда, он увеличит скорость т.к. там есть "железный" кеш.
Да S3 тормозит по сравнению с обычным сервером.
Описал решение, т.к. в вашем случае оно может и сработает. Тем более никаких особых затрат на его создание не нужно, но оперативку все же лучше использовать по прямому назначению. Если уж совсем решилсь то можно купить спец плату воткнуть в нее оперативки и сделать ram-жесткий диск. Ситуация вполне рабочая и проверялась мной, правда под виндой с перепроведением базы 1с 7.7
Разумнее раздавать их с рейда, он увеличит скорость т.к. там есть "железный" кеш.
Да S3 тормозит по сравнению с обычным сервером.
- mihan007
- Сообщения: 31
- Зарегистрирован: 2011.01.28, 11:05
- Откуда: Санкт-Петербург
- Контактная информация:
Re: yii отдача динамического файла
возможно вот это расширение будет полезно: http://www.yiiframework.com/extension/edownloadhelper/
Re: yii отдача динамического файла
Что-то не пойму с X-Accel-Redirect...
Если верить мануалу к CHttpRequest->xSendFile() посылать надо физическое место физического расположения файла, однако дальше написано, что в настройках нжинкса надо прописать локейшн с директивой internal, который будет тоже прослойкой.
Вот для этого примера как надо прописать локейшн?
UPD: Ну да, вроде подразобрался... надо бы в мануал внести пояснения.
В общем, в xSendFile надо путь прописывать относительно локейшна, т.е.:
И в конфиге нжинкса:
Пойду проверять
Если верить мануалу к CHttpRequest->xSendFile() посылать надо физическое место физического расположения файла, однако дальше написано, что в настройках нжинкса надо прописать локейшн с директивой internal, который будет тоже прослойкой.
Вот для этого примера как надо прописать локейшн?
Код: Выделить всё
Yii::app()->request->xSendFile('/home/user/Pictures/picture1.jpg',array(
'saveName'=>'RequestedFile.jpg',
'mimeType'=>'image/jpeg',
'terminate'=>false,
));
В общем, в xSendFile надо путь прописывать относительно локейшна, т.е.:
Код: Выделить всё
Yii::app()->request->xSendFile('/files/Pictures/picture1.jpg',array(
'saveName'=>'RequestedFile.jpg',
));
Код: Выделить всё
location /files {
root /home/user;
internal;
}
Re: yii отдача динамического файла
Нифига не работает Нигде не могу найти -- X-Accel-Redirect -- это вообще отдельная фича или родная функция nginx?
Чо-то все настроил вроде как положено, но в результате -- полная тишина. Даже в логах что-то ничего нет.
Чо-то все настроил вроде как положено, но в результате -- полная тишина. Даже в логах что-то ничего нет.