SlideShare une entreprise Scribd logo
1  sur  17
25 -27 April, 2014 http://camp2014.drupal.dn.ua
Caching on highload
Drupal site.
❏Как мы работаем с кешем в
Drupal
❏Зачем нам нужны цепочки тегов
❏Принцип построения цепочки
тегов
❏Где можно использовать цепочки
тегов
❏Частный пример использования
О чем мы сегодня будем говорить
function my_module_function() {
// Проверяем доступен ли кеш
if ($cache = cache_get('my_module_data')) {
// Если да то возвращаем данные.
$my_data = $cache->data;
}
else {
// Если кеш недоступен то выполняем нужные операции.
$my_data = my_module_get_some_data();
// Сохраянем кеш.
cache_set('my_module_data', $my_data, 'cache');
}
return $my_data;
}
Проверка доступности кешированных данных.
Операции с какими либо данными. Сохранение данных в кеш
Обычная работа с кешем
❏Всегда знаем в каком кеше
участвуют данные
❏Возможность получить
управляемый кеш
❏Высокая релевантность данных
хранимых в кеше
❏Снижение нагрузки на сайт при
очистке кеша
Зачем нам нужны цепочки тегов
Время потраченное на генерацию
страницы
Для примера возьмем ноду, при выводе которой используется еще 10
референс нод
Без кеширования Контент из
кеша
700
мс
1 мс
Схема построения цепочки
Drupal
callback
Browser
Request
Response
Cache get
Cache start
Cache tag
Cache tag applyCache set
Using generated
tags
Принцип построения цепочки тегов
Знаем момент
начала и конца
работы с
кешируемыми
данными
Можем сопроводить
наши данные и
составить цепочку
тегов
function my_module_function() {
$cache_id = ‘some_id’;
if ($cache = qtools_api__cache_get($cache_id, 'cache')) {
$mydata = $cache->data;
}
else {
// Момент начала работы с кешем.
$locked = qtools_api__cache_start($cache_id);
$mydata = my_module_get_some_data();
if ($locked) {
// Создаем и применяем тег.
$tag = qtools_api__cache_tag(‘node’, ‘1’);
qtools_api__cache_tag_apply($tag);
// Момент когда работа с кешем закончена.
$tags = qtools_api__cache_set($cache_id, $mydata, 'cache', ‘600’);
}
}
return $mydata;
}
Необходимо сделать механизм гибкого кеширования данных, с учетом отображения
специфической информации в зависимости от контекста кешируемых данных.
Разделение кеша
Разделение кеша
❏ Разделить кеш нам поможет уникальный cache_id.
❏ Для данных хорошим вариантом при генерации cache_id будет использование
глобальных данных относящихся к этому кешу, например язык на котором он доступен,
id домена, роли пользователя.
Пример генерации cache_id используемый при рендере сущности:
$cache_id = implode(':', array(
$entity_type,
$entity_id,
$view_mode,
implode('_', array_keys($user->roles)),
$domain['domain_id'],
$language->language,
));
function qtools_api__cache_get($cid, $bin = 'cache', $wait = 3, $stale = 60) {
$lid = 'qtools_api__cache_lock:' . $cid;
// Check if we not rebuilding this $cid.
if ($wait > 0 && !lock_may_be_available($lid)) {
if (lock_wait($lid, $wait) == FALSE) {
// If not we only interested in cache that does not expire.
$stale = 0;
}
}
else {
// Rely only on expire if wait = 0.
$stale = 0;
}
// Load cache from a bin.
$cache = cache_get($cid, $bin);
// Reset cache if it is expire, or temporary.
if (!empty($cache) && !empty($cache->expire)
&& ($cache->expire < (time() - $stale))) {
$cache = NULL;
}
// Return cache if exists.
return $cache;
}
Функция
получения кеша,
использует
стандартный
cache_get Drupal.
Также добавлена
проверка на время
жизни кеша.
Cache get
/**
* Cache start.
*/
function qtools_api__cache_start($cid, $lock = 30) {
// Prepare fresh tags array.
$tags = &drupal_static('qtools_api__cache_tag', array());
$tags[$cid] = array();
// Attempt to aquire lock.
$lid = 'qtools_api__cache_lock:' . $cid;
return lock_acquire($lid, $lock);
}
Работу с
цепочкой
начинаем
функцией ее
открытия,
объявляем
статик
переменную где
будем хранить
цепочку, и
ставим lock.
Открытие цепочки тегов
Cache
start
/**
* Make simple tag.
*/
function qtools_api__cache_tag($type, $value) {
$short = qtools_api__cache_tag_short();
if (!empty($short[$type])) {
$type = $short[$type];
}
// Normalize tag.
$tag = current(qtools_api__cache_tags_prepare($type . '|' . $value));
return $tag;
}
Эта функция создает
тег, также тут мы
пытаемся получить
шорт имя для тега.
В результате
выполнения для ноды
с nid=1 получим тег
вида “n|1”
Создание тега
Cache
tag
/**
* Cache tag.
* If seed are not specified mark all opened cache pipes.
* Note that any ';' will be replaced with dash.
*/
function qtools_api__cache_tag_apply($tag, $cids = array()) {
$tags = &drupal_static('qtools_api__cache_tag', array());
$keys = !empty($cids)
? $cids
: array_keys($tags);
// Normalize tag.
$tag = qtools_api__cache_tags_prepare($tag);
$return = array();
foreach ($keys as $key) {
if (isset($tags[$key])) {
$tags[$key] = array_unique(array_merge($tags[$key], array_values($tag)));
$return[$key] = $tags[$key];
}
}
return $return;
}
Собираем цепочку
из тегов. На
выходе будем
иметь теги всех
данных
участвовавших в
генерации
контента. Пример
цепочки
“n|5376;n|1285;t|165;n|
530;n|169;n|214”
Добавление тега в цепочку
Cache
tag
apply
/**
* Cache set.
*/
function qtools_api__cache_set($cid, $data, $bin = 'cache', $expire =
CACHE_PERMANENT) {
$track_tags = qtools_api__cache_tags_for($cid, TRUE);
// Add tags to cache object if required.
if (is_array($data) && isset($data['tags']) && is_array($data['tags'])) {
$data['tags'] = array_unique(array_merge($data['tags'], $track_tags));
}
// Set cache.
cache_set($cid, $data, $bin, $expire);
// Release lock.
$lid = 'qtools_api__cache_lock:' . $cid;
lock_release($lid);
return $track_tags;
}
Сохраняем кеш
и снимаем lock
Возвращаем
полученную
цепочку тегов
Cache
set
Сохраняем кеш
Cache
set
Связь с Drupal кешем
Чтоже делать с полученной цепочкой тегов? Например мы можем ее использовать для
очищения только нужного кеша в Drupal. Для этого нам понадобится таблица для связи
cache id и тегов которые участвовали в создании этого кеша.
Эта таблица может быть такого вида:
Поле cid bin expire tags
Тип поля varchar varchar int text
Описание Хранит кеш ID для
связи с кешем
Храним имя корзины
чтобы в
последующем найти
кеш
Срок жизни кеша Теги примененные к
кешу
В эту таблицу мы будем производить запись сразу после того как закрываем цепочку тегов.
Таким образом мы получаем связь между таблицей кеша и полученными тегами и можем
найти и очистить кеш в который маркирован этими тегами.
Где можно использовать цепочки
тегов
1. При стандартном кешировании в Drupal.
2. Теги можно проставлять в загловок страницы и
использовать как cache id для кеширования данных
реверс прокси сервером, к примеру Varnish.
3. В целом полученные теги Вы можете адаптировать к
любой системе кеширования.
THANK YOU!
Шуменко Александр
Adyax Company
Email: alexander.shumenko@gmail.com
Skype: alexander.shumenko

Contenu connexe

Tendances

PHP Advanced
PHP AdvancedPHP Advanced
PHP AdvancedNoveo
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jqueryITmozg
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Cтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBCтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBDmitry Viskov
 
Написание DSL в Perl
Написание DSL в PerlНаписание DSL в Perl
Написание DSL в Perlmayperl
 
Mongo db aggregation
Mongo db aggregationMongo db aggregation
Mongo db aggregationAcceptic
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоAlexander Makarov
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?yiiconf
 
О кэшировании (Андрей Шетухин)
О кэшировании (Андрей Шетухин)О кэшировании (Андрей Шетухин)
О кэшировании (Андрей Шетухин)Ontico
 
Drupal 8 API для разработчиков
Drupal 8 API для разработчиковDrupal 8 API для разработчиков
Drupal 8 API для разработчиковDrupalSPB
 
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Moscow.pm
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в MagentoMagecom Ukraine
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Ilyas Salikhov
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Moscow.pm
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 

Tendances (20)

PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Cтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBCтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDB
 
Написание DSL в Perl
Написание DSL в PerlНаписание DSL в Perl
Написание DSL в Perl
 
Mongo db aggregation
Mongo db aggregationMongo db aggregation
Mongo db aggregation
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?
 
Avito / SPA Meetup 2
Avito / SPA Meetup 2Avito / SPA Meetup 2
Avito / SPA Meetup 2
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
О кэшировании (Андрей Шетухин)
О кэшировании (Андрей Шетухин)О кэшировании (Андрей Шетухин)
О кэшировании (Андрей Шетухин)
 
Drupal 8 API для разработчиков
Drupal 8 API для разработчиковDrupal 8 API для разработчиков
Drupal 8 API для разработчиков
 
Dependency injection, phemto
Dependency injection, phemtoDependency injection, phemto
Dependency injection, phemto
 
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 

En vedette

Александр Шуменко - Varnish for authenticated users
Александр Шуменко - Varnish for authenticated usersАлександр Шуменко - Varnish for authenticated users
Александр Шуменко - Varnish for authenticated usersLEDC 2016
 
Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013
Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013
Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013odnoklassniki.ru
 
16-2313F_Journal_RecrutementCSC_08-16_FINAL
16-2313F_Journal_RecrutementCSC_08-16_FINAL16-2313F_Journal_RecrutementCSC_08-16_FINAL
16-2313F_Journal_RecrutementCSC_08-16_FINALPhilippe Vasoyan
 
Trabajo informatica hanny
Trabajo informatica hannyTrabajo informatica hanny
Trabajo informatica hannyHanny97
 
Bolsas de plastico
Bolsas de plasticoBolsas de plastico
Bolsas de plasticolicjohanabel
 
Класс!ная Cassandra
Класс!ная CassandraКласс!ная Cassandra
Класс!ная Cassandraodnoklassniki.ru
 
Administracion de identidades - Revista Magazcitum (México)
Administracion de identidades - Revista Magazcitum (México)Administracion de identidades - Revista Magazcitum (México)
Administracion de identidades - Revista Magazcitum (México)Fabián Descalzo
 
Solving anything in VCL
Solving anything in VCLSolving anything in VCL
Solving anything in VCLFastly
 
Presentatie ttc nl 28 02 %282%29
Presentatie ttc nl 28 02 %282%29Presentatie ttc nl 28 02 %282%29
Presentatie ttc nl 28 02 %282%29jornmineur
 

En vedette (11)

Александр Шуменко - Varnish for authenticated users
Александр Шуменко - Varnish for authenticated usersАлександр Шуменко - Varnish for authenticated users
Александр Шуменко - Varnish for authenticated users
 
Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013
Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013
Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013
 
16-2313F_Journal_RecrutementCSC_08-16_FINAL
16-2313F_Journal_RecrutementCSC_08-16_FINAL16-2313F_Journal_RecrutementCSC_08-16_FINAL
16-2313F_Journal_RecrutementCSC_08-16_FINAL
 
Trabajo informatica hanny
Trabajo informatica hannyTrabajo informatica hanny
Trabajo informatica hanny
 
Bolsas de plastico
Bolsas de plasticoBolsas de plastico
Bolsas de plastico
 
La historia de internet
La historia de internetLa historia de internet
La historia de internet
 
Lavidaesuntesoroprecioso
LavidaesuntesoropreciosoLavidaesuntesoroprecioso
Lavidaesuntesoroprecioso
 
Класс!ная Cassandra
Класс!ная CassandraКласс!ная Cassandra
Класс!ная Cassandra
 
Administracion de identidades - Revista Magazcitum (México)
Administracion de identidades - Revista Magazcitum (México)Administracion de identidades - Revista Magazcitum (México)
Administracion de identidades - Revista Magazcitum (México)
 
Solving anything in VCL
Solving anything in VCLSolving anything in VCL
Solving anything in VCL
 
Presentatie ttc nl 28 02 %282%29
Presentatie ttc nl 28 02 %282%29Presentatie ttc nl 28 02 %282%29
Presentatie ttc nl 28 02 %282%29
 

Similaire à Caching on highload Drupal site - Alexander Shumenko

Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)Symfoniacs
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.DrupalCampDN
 
Enterprise Patterns in Magento
Enterprise Patterns in MagentoEnterprise Patterns in Magento
Enterprise Patterns in MagentoVrann Tulika
 
Управление файловым сервером с помощью PowerShell
Управление файловым сервером с помощью PowerShellУправление файловым сервером с помощью PowerShell
Управление файловым сервером с помощью PowerShellAndrey Markin
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Anastasia Lubennikova
 
Повышаем производительность Drupal-сайта
Повышаем производительность Drupal-сайтаПовышаем производительность Drupal-сайта
Повышаем производительность Drupal-сайтаВладимир Колос
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном кодеKolya Korobochkin
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersPositive Hack Days
 
Top 10 problems supporting Magento customers
Top 10 problems supporting Magento customersTop 10 problems supporting Magento customers
Top 10 problems supporting Magento customersaheadWorks
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Open-IT
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)ygoltsev
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWPositive Hack Days
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвMail.ru Group
 

Similaire à Caching on highload Drupal site - Alexander Shumenko (20)

Render API.
Render API.Render API.
Render API.
 
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
Enterprise Patterns in Magento
Enterprise Patterns in MagentoEnterprise Patterns in Magento
Enterprise Patterns in Magento
 
Управление файловым сервером с помощью PowerShell
Управление файловым сервером с помощью PowerShellУправление файловым сервером с помощью PowerShell
Управление файловым сервером с помощью PowerShell
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
 
DSLs в Perl
DSLs в PerlDSLs в Perl
DSLs в Perl
 
Повышаем производительность Drupal-сайта
Повышаем производительность Drupal-сайтаПовышаем производительность Drupal-сайта
Повышаем производительность Drupal-сайта
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном коде
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappers
 
Top 10 problems supporting Magento customers
Top 10 problems supporting Magento customersTop 10 problems supporting Magento customers
Top 10 problems supporting Magento customers
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
 
Yserver
YserverYserver
Yserver
 
I Net
I NetI Net
I Net
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
 
Rose::DB
Rose::DBRose::DB
Rose::DB
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 
Survive with OOP
Survive with OOPSurvive with OOP
Survive with OOP
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий Копачёв
 

Plus de DrupalCampDN

Drupal - Changing the Web by Connecting Open Minds - Josef Dabernig
Drupal - Changing the Web by Connecting Open Minds - Josef DabernigDrupal - Changing the Web by Connecting Open Minds - Josef Dabernig
Drupal - Changing the Web by Connecting Open Minds - Josef DabernigDrupalCampDN
 
Dependency Injection in Drupal 8 - Стадник АндрейQweqwe
Dependency Injection in Drupal 8 - Стадник АндрейQweqweDependency Injection in Drupal 8 - Стадник АндрейQweqwe
Dependency Injection in Drupal 8 - Стадник АндрейQweqweDrupalCampDN
 
Our AWS Cloud Journey - Andrew Boag
Our AWS Cloud Journey - Andrew BoagOur AWS Cloud Journey - Andrew Boag
Our AWS Cloud Journey - Andrew BoagDrupalCampDN
 
Guzzle in Drupal 8 and as a REST client - Артем Мирошник
Guzzle in Drupal 8 and as a REST client - Артем МирошникGuzzle in Drupal 8 and as a REST client - Артем Мирошник
Guzzle in Drupal 8 and as a REST client - Артем МирошникDrupalCampDN
 
Blocks & Layouts in D7 - Josef Dabernig
Blocks & Layouts in D7 - Josef DabernigBlocks & Layouts in D7 - Josef Dabernig
Blocks & Layouts in D7 - Josef DabernigDrupalCampDN
 
CKEditor в Drupal: тонкая настройка и кастомизация - Osman Seferov
CKEditor в Drupal: тонкая настройка и кастомизация - Osman SeferovCKEditor в Drupal: тонкая настройка и кастомизация - Osman Seferov
CKEditor в Drupal: тонкая настройка и кастомизация - Osman SeferovDrupalCampDN
 
Drush - use full power - Alexander Schedrov
Drush - use full power - Alexander SchedrovDrush - use full power - Alexander Schedrov
Drush - use full power - Alexander SchedrovDrupalCampDN
 
Это Drupal, %username%! - Андрей Черноус
Это Drupal, %username%! - Андрей ЧерноусЭто Drupal, %username%! - Андрей Черноус
Это Drupal, %username%! - Андрей ЧерноусDrupalCampDN
 
Migrate - new way site upgrade
Migrate - new way site upgradeMigrate - new way site upgrade
Migrate - new way site upgradeDrupalCampDN
 
Rich Text in Drupal - Вадим Валуев
Rich Text in Drupal - Вадим ВалуевRich Text in Drupal - Вадим Валуев
Rich Text in Drupal - Вадим ВалуевDrupalCampDN
 
May the parallelity be with you! Distributed computing using Erlang language ...
May the parallelity be with you! Distributed computing using Erlang language ...May the parallelity be with you! Distributed computing using Erlang language ...
May the parallelity be with you! Distributed computing using Erlang language ...DrupalCampDN
 
Panels как философия - Alexander Danilenko
Panels как философия - Alexander DanilenkoPanels как философия - Alexander Danilenko
Panels как философия - Alexander DanilenkoDrupalCampDN
 
DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...DrupalCampDN
 
Twig internals - Maksym MoskvychevTwig internals maksym moskvychev
Twig internals - Maksym MoskvychevTwig internals   maksym moskvychevTwig internals - Maksym MoskvychevTwig internals   maksym moskvychev
Twig internals - Maksym MoskvychevTwig internals maksym moskvychevDrupalCampDN
 
Презентация модуля YandexMoney - Yury Glushkov
Презентация модуля YandexMoney - Yury GlushkovПрезентация модуля YandexMoney - Yury Glushkov
Презентация модуля YandexMoney - Yury GlushkovDrupalCampDN
 
Drupal and Outer space - Martin Mayer
Drupal and Outer space - Martin MayerDrupal and Outer space - Martin Mayer
Drupal and Outer space - Martin MayerDrupalCampDN
 
Boost your theming skills - Artem Shymko
Boost your theming skills - Artem ShymkoBoost your theming skills - Artem Shymko
Boost your theming skills - Artem ShymkoDrupalCampDN
 
Continious integration - Иван Лещёв
Continious integration - Иван ЛещёвContinious integration - Иван Лещёв
Continious integration - Иван ЛещёвDrupalCampDN
 
Rules - Yaroslav Doroshuk
Rules - Yaroslav DoroshukRules - Yaroslav Doroshuk
Rules - Yaroslav DoroshukDrupalCampDN
 
Системы управления взаимоотношениями с клиентами. Drupal CRM Core. - Вадим Ми...
Системы управления взаимоотношениями с клиентами. Drupal CRM Core. - Вадим Ми...Системы управления взаимоотношениями с клиентами. Drupal CRM Core. - Вадим Ми...
Системы управления взаимоотношениями с клиентами. Drupal CRM Core. - Вадим Ми...DrupalCampDN
 

Plus de DrupalCampDN (20)

Drupal - Changing the Web by Connecting Open Minds - Josef Dabernig
Drupal - Changing the Web by Connecting Open Minds - Josef DabernigDrupal - Changing the Web by Connecting Open Minds - Josef Dabernig
Drupal - Changing the Web by Connecting Open Minds - Josef Dabernig
 
Dependency Injection in Drupal 8 - Стадник АндрейQweqwe
Dependency Injection in Drupal 8 - Стадник АндрейQweqweDependency Injection in Drupal 8 - Стадник АндрейQweqwe
Dependency Injection in Drupal 8 - Стадник АндрейQweqwe
 
Our AWS Cloud Journey - Andrew Boag
Our AWS Cloud Journey - Andrew BoagOur AWS Cloud Journey - Andrew Boag
Our AWS Cloud Journey - Andrew Boag
 
Guzzle in Drupal 8 and as a REST client - Артем Мирошник
Guzzle in Drupal 8 and as a REST client - Артем МирошникGuzzle in Drupal 8 and as a REST client - Артем Мирошник
Guzzle in Drupal 8 and as a REST client - Артем Мирошник
 
Blocks & Layouts in D7 - Josef Dabernig
Blocks & Layouts in D7 - Josef DabernigBlocks & Layouts in D7 - Josef Dabernig
Blocks & Layouts in D7 - Josef Dabernig
 
CKEditor в Drupal: тонкая настройка и кастомизация - Osman Seferov
CKEditor в Drupal: тонкая настройка и кастомизация - Osman SeferovCKEditor в Drupal: тонкая настройка и кастомизация - Osman Seferov
CKEditor в Drupal: тонкая настройка и кастомизация - Osman Seferov
 
Drush - use full power - Alexander Schedrov
Drush - use full power - Alexander SchedrovDrush - use full power - Alexander Schedrov
Drush - use full power - Alexander Schedrov
 
Это Drupal, %username%! - Андрей Черноус
Это Drupal, %username%! - Андрей ЧерноусЭто Drupal, %username%! - Андрей Черноус
Это Drupal, %username%! - Андрей Черноус
 
Migrate - new way site upgrade
Migrate - new way site upgradeMigrate - new way site upgrade
Migrate - new way site upgrade
 
Rich Text in Drupal - Вадим Валуев
Rich Text in Drupal - Вадим ВалуевRich Text in Drupal - Вадим Валуев
Rich Text in Drupal - Вадим Валуев
 
May the parallelity be with you! Distributed computing using Erlang language ...
May the parallelity be with you! Distributed computing using Erlang language ...May the parallelity be with you! Distributed computing using Erlang language ...
May the parallelity be with you! Distributed computing using Erlang language ...
 
Panels как философия - Alexander Danilenko
Panels как философия - Alexander DanilenkoPanels как философия - Alexander Danilenko
Panels как философия - Alexander Danilenko
 
DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...DrupalGap. How to create native application for mobile devices based on Drupa...
DrupalGap. How to create native application for mobile devices based on Drupa...
 
Twig internals - Maksym MoskvychevTwig internals maksym moskvychev
Twig internals - Maksym MoskvychevTwig internals   maksym moskvychevTwig internals - Maksym MoskvychevTwig internals   maksym moskvychev
Twig internals - Maksym MoskvychevTwig internals maksym moskvychev
 
Презентация модуля YandexMoney - Yury Glushkov
Презентация модуля YandexMoney - Yury GlushkovПрезентация модуля YandexMoney - Yury Glushkov
Презентация модуля YandexMoney - Yury Glushkov
 
Drupal and Outer space - Martin Mayer
Drupal and Outer space - Martin MayerDrupal and Outer space - Martin Mayer
Drupal and Outer space - Martin Mayer
 
Boost your theming skills - Artem Shymko
Boost your theming skills - Artem ShymkoBoost your theming skills - Artem Shymko
Boost your theming skills - Artem Shymko
 
Continious integration - Иван Лещёв
Continious integration - Иван ЛещёвContinious integration - Иван Лещёв
Continious integration - Иван Лещёв
 
Rules - Yaroslav Doroshuk
Rules - Yaroslav DoroshukRules - Yaroslav Doroshuk
Rules - Yaroslav Doroshuk
 
Системы управления взаимоотношениями с клиентами. Drupal CRM Core. - Вадим Ми...
Системы управления взаимоотношениями с клиентами. Drupal CRM Core. - Вадим Ми...Системы управления взаимоотношениями с клиентами. Drupal CRM Core. - Вадим Ми...
Системы управления взаимоотношениями с клиентами. Drupal CRM Core. - Вадим Ми...
 

Caching on highload Drupal site - Alexander Shumenko

  • 1. 25 -27 April, 2014 http://camp2014.drupal.dn.ua Caching on highload Drupal site.
  • 2. ❏Как мы работаем с кешем в Drupal ❏Зачем нам нужны цепочки тегов ❏Принцип построения цепочки тегов ❏Где можно использовать цепочки тегов ❏Частный пример использования О чем мы сегодня будем говорить
  • 3. function my_module_function() { // Проверяем доступен ли кеш if ($cache = cache_get('my_module_data')) { // Если да то возвращаем данные. $my_data = $cache->data; } else { // Если кеш недоступен то выполняем нужные операции. $my_data = my_module_get_some_data(); // Сохраянем кеш. cache_set('my_module_data', $my_data, 'cache'); } return $my_data; } Проверка доступности кешированных данных. Операции с какими либо данными. Сохранение данных в кеш Обычная работа с кешем
  • 4. ❏Всегда знаем в каком кеше участвуют данные ❏Возможность получить управляемый кеш ❏Высокая релевантность данных хранимых в кеше ❏Снижение нагрузки на сайт при очистке кеша Зачем нам нужны цепочки тегов
  • 5. Время потраченное на генерацию страницы Для примера возьмем ноду, при выводе которой используется еще 10 референс нод Без кеширования Контент из кеша 700 мс 1 мс
  • 6. Схема построения цепочки Drupal callback Browser Request Response Cache get Cache start Cache tag Cache tag applyCache set Using generated tags
  • 7. Принцип построения цепочки тегов Знаем момент начала и конца работы с кешируемыми данными Можем сопроводить наши данные и составить цепочку тегов function my_module_function() { $cache_id = ‘some_id’; if ($cache = qtools_api__cache_get($cache_id, 'cache')) { $mydata = $cache->data; } else { // Момент начала работы с кешем. $locked = qtools_api__cache_start($cache_id); $mydata = my_module_get_some_data(); if ($locked) { // Создаем и применяем тег. $tag = qtools_api__cache_tag(‘node’, ‘1’); qtools_api__cache_tag_apply($tag); // Момент когда работа с кешем закончена. $tags = qtools_api__cache_set($cache_id, $mydata, 'cache', ‘600’); } } return $mydata; }
  • 8. Необходимо сделать механизм гибкого кеширования данных, с учетом отображения специфической информации в зависимости от контекста кешируемых данных. Разделение кеша
  • 9. Разделение кеша ❏ Разделить кеш нам поможет уникальный cache_id. ❏ Для данных хорошим вариантом при генерации cache_id будет использование глобальных данных относящихся к этому кешу, например язык на котором он доступен, id домена, роли пользователя. Пример генерации cache_id используемый при рендере сущности: $cache_id = implode(':', array( $entity_type, $entity_id, $view_mode, implode('_', array_keys($user->roles)), $domain['domain_id'], $language->language, ));
  • 10. function qtools_api__cache_get($cid, $bin = 'cache', $wait = 3, $stale = 60) { $lid = 'qtools_api__cache_lock:' . $cid; // Check if we not rebuilding this $cid. if ($wait > 0 && !lock_may_be_available($lid)) { if (lock_wait($lid, $wait) == FALSE) { // If not we only interested in cache that does not expire. $stale = 0; } } else { // Rely only on expire if wait = 0. $stale = 0; } // Load cache from a bin. $cache = cache_get($cid, $bin); // Reset cache if it is expire, or temporary. if (!empty($cache) && !empty($cache->expire) && ($cache->expire < (time() - $stale))) { $cache = NULL; } // Return cache if exists. return $cache; } Функция получения кеша, использует стандартный cache_get Drupal. Также добавлена проверка на время жизни кеша. Cache get
  • 11. /** * Cache start. */ function qtools_api__cache_start($cid, $lock = 30) { // Prepare fresh tags array. $tags = &drupal_static('qtools_api__cache_tag', array()); $tags[$cid] = array(); // Attempt to aquire lock. $lid = 'qtools_api__cache_lock:' . $cid; return lock_acquire($lid, $lock); } Работу с цепочкой начинаем функцией ее открытия, объявляем статик переменную где будем хранить цепочку, и ставим lock. Открытие цепочки тегов Cache start
  • 12. /** * Make simple tag. */ function qtools_api__cache_tag($type, $value) { $short = qtools_api__cache_tag_short(); if (!empty($short[$type])) { $type = $short[$type]; } // Normalize tag. $tag = current(qtools_api__cache_tags_prepare($type . '|' . $value)); return $tag; } Эта функция создает тег, также тут мы пытаемся получить шорт имя для тега. В результате выполнения для ноды с nid=1 получим тег вида “n|1” Создание тега Cache tag
  • 13. /** * Cache tag. * If seed are not specified mark all opened cache pipes. * Note that any ';' will be replaced with dash. */ function qtools_api__cache_tag_apply($tag, $cids = array()) { $tags = &drupal_static('qtools_api__cache_tag', array()); $keys = !empty($cids) ? $cids : array_keys($tags); // Normalize tag. $tag = qtools_api__cache_tags_prepare($tag); $return = array(); foreach ($keys as $key) { if (isset($tags[$key])) { $tags[$key] = array_unique(array_merge($tags[$key], array_values($tag))); $return[$key] = $tags[$key]; } } return $return; } Собираем цепочку из тегов. На выходе будем иметь теги всех данных участвовавших в генерации контента. Пример цепочки “n|5376;n|1285;t|165;n| 530;n|169;n|214” Добавление тега в цепочку Cache tag apply
  • 14. /** * Cache set. */ function qtools_api__cache_set($cid, $data, $bin = 'cache', $expire = CACHE_PERMANENT) { $track_tags = qtools_api__cache_tags_for($cid, TRUE); // Add tags to cache object if required. if (is_array($data) && isset($data['tags']) && is_array($data['tags'])) { $data['tags'] = array_unique(array_merge($data['tags'], $track_tags)); } // Set cache. cache_set($cid, $data, $bin, $expire); // Release lock. $lid = 'qtools_api__cache_lock:' . $cid; lock_release($lid); return $track_tags; } Сохраняем кеш и снимаем lock Возвращаем полученную цепочку тегов Cache set Сохраняем кеш Cache set
  • 15. Связь с Drupal кешем Чтоже делать с полученной цепочкой тегов? Например мы можем ее использовать для очищения только нужного кеша в Drupal. Для этого нам понадобится таблица для связи cache id и тегов которые участвовали в создании этого кеша. Эта таблица может быть такого вида: Поле cid bin expire tags Тип поля varchar varchar int text Описание Хранит кеш ID для связи с кешем Храним имя корзины чтобы в последующем найти кеш Срок жизни кеша Теги примененные к кешу В эту таблицу мы будем производить запись сразу после того как закрываем цепочку тегов. Таким образом мы получаем связь между таблицей кеша и полученными тегами и можем найти и очистить кеш в который маркирован этими тегами.
  • 16. Где можно использовать цепочки тегов 1. При стандартном кешировании в Drupal. 2. Теги можно проставлять в загловок страницы и использовать как cache id для кеширования данных реверс прокси сервером, к примеру Varnish. 3. В целом полученные теги Вы можете адаптировать к любой системе кеширования.
  • 17. THANK YOU! Шуменко Александр Adyax Company Email: alexander.shumenko@gmail.com Skype: alexander.shumenko