Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Хранение, обработка и отдача
статики
Мокевнин Кирилл, 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

More Related Content

Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социальной сети starlook.ru

  • 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