SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Хранение, обработка и отдача статики
Мокевнин Кирилл, undev.ru
Хранение загруженных файлов
Хранилище:
• Локальная файловая система.
• База данных.
• NFS.
• Amazon S3.
• Webdav.
Организация файлов в локальной ФС:
• Соглашения.
• Общий подход.
WEBDAV
- это современный и защищённый сетевой протокол
высокого уровня, работающий поверх HTTP для
доступа к объектам и коллекциям объектов.
• Выполнение основных файловых операций над
объектами на удаленном сервере.
• ngx_http_dav_module или mod_dav.
• Для использования в ZF - Zend_Http_Client.
Сервера и их взаимодействие
Сервера и их взаимодействие
Сервера и их взаимодействие
• Один сервер -> VPS -> Кластер.
• Storage хранит только исходники картинок.
• На storage серверах стоит nginx с модулем
ngx_http_dav_module.
• Create_full_put_path on.
• Webdav используется только для загрузки
картинок на storage.
Организация хранилища (пути),
взаимодействие с базой и связь с
сущностями приложения.
Загрузка
Загрузка файлов
• Для каждого файла своя запись в таблице.
• is_deleted и is_ready для отложенной
обработки.
• На основе id генерируется путь
161/374/000473161 до файла на storage
сервере.
• Каждая сущность в базе, имеющая
файл(ы), связывается с id файла.
Формирование урлов, конфигурация
превью картинок.
Отдача файлов
Отдача файлов
Конфигурационный файл с типами картинок и
настройками для ресайза, картинка по
умолчанию (заглушка).
[user_avatar]
resize.big.OutputFileFormat = jpg
resize.big.width = 236
resize.big.height = 177
resize.medium.keepFrame = true
resize.medium.width = 144
resize.medium.height = 108
Отдача файлов
View Helper для генерации ссылок.
$this->image($avatar_file_id, 'user_avatar', 'big')
• http://static.starlook.ru/sets-medium-947826-
4fc400fb-image.jpg
• HTTP_UrlSigner (dklab.ru)
• Если avatar_file_id == null, то возвращает
путь на заглушку.
Устройство ресайзера. Кеширование.
Устройство ресайзера. Кеширование.
• Кеширует nginx, ресайзит php.
• Кешируем на клиенте навсегда.
• В скрипте ресайзера не нужно поднимать
bootstrap ZF).
• В nginx нужно разделять пулы коннектов для
отдачи из кеша и ресайза.
• Благодаря цифровому подписыванию ресайзит
только в разрешенные размеры.
Собирая все вместе
• Создание записи в базе при загрузке картинки и
перемещение исходного файла в необходимую
директорию.
• Файл конфигурации.
• Вью хелпер для урлов.
• Скрипт для генерации картинок (с
кешированием).
Загрузка файлов
$client = new Ext_Webdav_Client($connect_params);
$adapter = new Ext_File_Adapter_Webdav();
$adapter->setClient($adapter);
$transfer = new Ext_File_Transfer();
$transfer->setAdapter($adapter);
Ext_Form_Element_File::setTransfer($transfer);
return $transfer;
Загрузка файлов
public function configure(Ext_File $file) {
$table = new File();
$row = $table->createRow();
list($row->width, $row->height) =
getimagesize($file->getFilePath());
$row->save();
$this->getAdapter()->setUri($this-
>generateUri($row->id));
return $row;
Загрузка файлов
$element = new Ext_Form_Element_File('files');
$element->setIsArray(true);
$element->setConfigurator(new
File_Configurator_WebdavDb());
$value = $element->getValue();
foreach ($value as $row) {
// processing
}
Спасибо за внимание!
E-mail: mokevnin@gmail.com
Блог: www.wddx.ru
twitter.com/mokevnin

Weitere ähnliche Inhalte

Was ist angesagt?

Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
Nikita Borzykh
 
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (..."Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
AvitoTech
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
7bits
 
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
zfconfua
 

Was ist angesagt? (20)

Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
 
Thumbtack Expertise Days # 5 - Ansible
Thumbtack Expertise Days # 5 - AnsibleThumbtack Expertise Days # 5 - Ansible
Thumbtack Expertise Days # 5 - Ansible
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»
 
Страх и ненависть в Event Bus
Страх и ненависть в Event BusСтрах и ненависть в Event Bus
Страх и ненависть в Event Bus
 
17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения
 
02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты
 
05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы
 
High Availability в жизни обычного разработчика
High Availability в жизни обычного разработчикаHigh Availability в жизни обычного разработчика
High Availability в жизни обычного разработчика
 
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
 
Зачем программистам Ansible
Зачем программистам AnsibleЗачем программистам Ansible
Зачем программистам Ansible
 
Применяем Ansible
Применяем AnsibleПрименяем Ansible
Применяем Ansible
 
03 web server_architecture_ru
03 web server_architecture_ru03 web server_architecture_ru
03 web server_architecture_ru
 
How to build solid CI-CD pipeline / Илья Беда (beda.software)
How to build solid CI-CD pipeline / Илья Беда (beda.software)How to build solid CI-CD pipeline / Илья Беда (beda.software)
How to build solid CI-CD pipeline / Илья Беда (beda.software)
 
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (..."Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
 
HSE{Consult}: DevOps – новая методология разработки
HSE{Consult}: DevOps – новая методология разработкиHSE{Consult}: DevOps – новая методология разработки
HSE{Consult}: DevOps – новая методология разработки
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
 
CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев
CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан КупреевCRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев
CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев
 
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
 
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
 

Ähnlich wie Загрузка, обработка, хранение и отдача статики

Управление облачной инфраструктурой
Управление облачной инфраструктуройУправление облачной инфраструктурой
Управление облачной инфраструктурой
dddpaul
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
buranLcme
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)
Mikhail Davydov
 
Client optimization drupal
Client optimization drupalClient optimization drupal
Client optimization drupal
Yury Glushkov
 
Baseof servletsjava intro
Baseof servletsjava introBaseof servletsjava intro
Baseof servletsjava intro
alexey1991
 
Александр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.comАлександр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.com
Ontico
 
[ONSEC ]XSS vs waf
[ONSEC ]XSS vs waf[ONSEC ]XSS vs waf
[ONSEC ]XSS vs waf
d0znp
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Yandex
 

Ähnlich wie Загрузка, обработка, хранение и отдача статики (20)

(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
 
Rsnx tsvetkov che btrix conf 2015
Rsnx tsvetkov che btrix conf 2015Rsnx tsvetkov che btrix conf 2015
Rsnx tsvetkov che btrix conf 2015
 
Drupal в облаке - Владимир Юнев
Drupal в облаке - Владимир ЮневDrupal в облаке - Владимир Юнев
Drupal в облаке - Владимир Юнев
 
Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...
Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...
Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...
 
Web deployment
Web deploymentWeb deployment
Web deployment
 
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
 
Ускоряем Wordpress: кеширование, CDN, Varnish Cache
Ускоряем Wordpress: кеширование, CDN, Varnish CacheУскоряем Wordpress: кеширование, CDN, Varnish Cache
Ускоряем Wordpress: кеширование, CDN, Varnish Cache
 
Управление облачной инфраструктурой
Управление облачной инфраструктуройУправление облачной инфраструктурой
Управление облачной инфраструктурой
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
 
Windows azure общий обзор
Windows azure общий обзорWindows azure общий обзор
Windows azure общий обзор
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)
 
FT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это простоFT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это просто
 
Client optimization drupal
Client optimization drupalClient optimization drupal
Client optimization drupal
 
Baseof servletsjava intro
Baseof servletsjava introBaseof servletsjava intro
Baseof servletsjava intro
 
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
 
Александр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.comАлександр Соловьёв, Griddynamics.com
Александр Соловьёв, Griddynamics.com
 
[ONSEC ]XSS vs waf
[ONSEC ]XSS vs waf[ONSEC ]XSS vs waf
[ONSEC ]XSS vs waf
 
Основные аспекты управления веб-проектом в Microsoft Azure Websites
Основные аспекты управления веб-проектом в Microsoft Azure WebsitesОсновные аспекты управления веб-проектом в Microsoft Azure Websites
Основные аспекты управления веб-проектом в Microsoft Azure Websites
 
11 лекция, петр волков
11 лекция, петр волков11 лекция, петр волков
11 лекция, петр волков
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 

Загрузка, обработка, хранение и отдача статики

  • 1. Хранение, обработка и отдача статики Мокевнин Кирилл, undev.ru
  • 2. Хранение загруженных файлов Хранилище: • Локальная файловая система. • База данных. • NFS. • Amazon S3. • Webdav. Организация файлов в локальной ФС: • Соглашения. • Общий подход.
  • 3. WEBDAV - это современный и защищённый сетевой протокол высокого уровня, работающий поверх HTTP для доступа к объектам и коллекциям объектов. • Выполнение основных файловых операций над объектами на удаленном сервере. • ngx_http_dav_module или mod_dav. • Для использования в ZF - Zend_Http_Client.
  • 4. Сервера и их взаимодействие
  • 5. Сервера и их взаимодействие
  • 6. Сервера и их взаимодействие • Один сервер -> VPS -> Кластер. • Storage хранит только исходники картинок. • На storage серверах стоит nginx с модулем ngx_http_dav_module. • Create_full_put_path on. • Webdav используется только для загрузки картинок на storage.
  • 7. Организация хранилища (пути), взаимодействие с базой и связь с сущностями приложения. Загрузка
  • 8. Загрузка файлов • Для каждого файла своя запись в таблице. • is_deleted и is_ready для отложенной обработки. • На основе id генерируется путь 161/374/000473161 до файла на storage сервере. • Каждая сущность в базе, имеющая файл(ы), связывается с id файла.
  • 10. Отдача файлов Конфигурационный файл с типами картинок и настройками для ресайза, картинка по умолчанию (заглушка). [user_avatar] resize.big.OutputFileFormat = jpg resize.big.width = 236 resize.big.height = 177 resize.medium.keepFrame = true resize.medium.width = 144 resize.medium.height = 108
  • 11. Отдача файлов View Helper для генерации ссылок. $this->image($avatar_file_id, 'user_avatar', 'big') • http://static.starlook.ru/sets-medium-947826- 4fc400fb-image.jpg • HTTP_UrlSigner (dklab.ru) • Если avatar_file_id == null, то возвращает путь на заглушку.
  • 13. Устройство ресайзера. Кеширование. • Кеширует nginx, ресайзит php. • Кешируем на клиенте навсегда. • В скрипте ресайзера не нужно поднимать bootstrap ZF). • В nginx нужно разделять пулы коннектов для отдачи из кеша и ресайза. • Благодаря цифровому подписыванию ресайзит только в разрешенные размеры.
  • 14. Собирая все вместе • Создание записи в базе при загрузке картинки и перемещение исходного файла в необходимую директорию. • Файл конфигурации. • Вью хелпер для урлов. • Скрипт для генерации картинок (с кешированием).
  • 15. Загрузка файлов $client = new Ext_Webdav_Client($connect_params); $adapter = new Ext_File_Adapter_Webdav(); $adapter->setClient($adapter); $transfer = new Ext_File_Transfer(); $transfer->setAdapter($adapter); Ext_Form_Element_File::setTransfer($transfer); return $transfer;
  • 16. Загрузка файлов public function configure(Ext_File $file) { $table = new File(); $row = $table->createRow(); list($row->width, $row->height) = getimagesize($file->getFilePath()); $row->save(); $this->getAdapter()->setUri($this- >generateUri($row->id)); return $row;
  • 17. Загрузка файлов $element = new Ext_Form_Element_File('files'); $element->setIsArray(true); $element->setConfigurator(new File_Configurator_WebdavDb()); $value = $element->getValue(); foreach ($value as $row) { // processing }
  • 18. Спасибо за внимание! E-mail: mokevnin@gmail.com Блог: www.wddx.ru twitter.com/mokevnin