Sharder

Материал из CMS Sitebill Wiki
Перейти к навигации Перейти к поиску

Sharder – приложение

Для хранения файлов в облаке Яндекс-S3 вам необходимо зарегистрироваться по этой ссылке: https://console.cloud.yandex.ru

Приложение призвано сохранять картинки не на локальном диске хостинга внутри папки сайта, а на удаленном сервере.
На некоторых сайтах сейчас скопилось до 200 Гб картинок, поэтому назрел вопрос как их разделять по разным хранилищам.
В процессе обработки и сохранения поля uploads сначала картинки сохраняются как раньше в папку /img/data/. Это нужно чтобы они правильно ресайзились, переворачивались и накладывались водяные знаки.
Но после всех обработок, если включено приложение apps.sharding.enable тогда массив картинок передается на обработку классу
$result = $this->sharder->shard($files, $this->getServerFullUrl(true));

Эта процедура загружает файлы на удаленный сервер и в ответ получает URL адреса загруженных файлов.
Затем выполняется запаковка uploads поля, но теперь название каждого файла это URL-картинки. Также добавляется признак remote = ‘true’ чтобы в шаблонах и других приложениях было понятно что это не локальные картинки, а URL-адреса картинок.
array('preview' => $preview_url, 'normal' => $normal_url, 'type' => 'graphic', 'mime' => $ext, 'remote' => ‘true’);
Теперь при выводе в шаблонах нужно выполнять проверку признака remote, чтобы вместо формирования относительного пути, просто выдавать ее в чистом виде. Пример вывода картинок в шаблоне
<img src="{if $photoitem.remote}{$photoitem.normal}{else}{$estate_folder}/img/data/{$photoitem.normal}{/if}" />

Для миграции картинок из локального хранилища на шарды есть скрипт
/apps/sharder/cron.php?cron_key=XXX
Он загружает по N-записей и отправляет локальные файлы на удаленный сервер, заменяет uploads массив и затем удаляет локальные файлы. После каждого запуска порция записей отмечается как обработанная data.sharded = 1
Необходимо переделать способ вывода картинок в приложениях, которые используют картинки – выгрузки, например. Анализировать признак remote=’true’