Upload
zfconfua
View
4.422
Download
6
Embed Size (px)
DESCRIPTION
Кирилл Мокевнин Senior Developer, undev
Citation preview
Хранение, обработка и отдача статики
Мокевнин Кирилл, 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
}