Механизм работы кэша в umi — различия между версиями
Boykova (обсуждение | вклад) м (переименовал «Механизм работы кэша в umi» в «Механизм работы кеша в umi») |
Kalexey (обсуждение | вклад) м («Механизм работы кеша в umi» переименована в «Механизм работы кэша в umi» поверх перенаправления) |
(нет различий)
|
Версия 05:50, 15 августа 2012
Umi.cms поддерживает различные кеширующие механизмы, допустим apc, eaccelerator. В данной статье будет описан принцип работы кеша APC, все остальные типы действуют по аналогичной схеме. Основной php класс, который выполняет функции управления кешем находится в файле:
/classes/system/subsystems/cache/cacheFrontend.php.
Если на хостинге подключен один из поддерживаемых системой кеширующих механизмов:
- apc
- eaccelerator
- xcache
- memcached
тогда в модуле "Конфигурация", вкладка "Производительность" будет доступен для выбора кеш, подключенный на хостинге. Допустим мы включили кеш APC. Если вы уже просматривали код системы, то в очень многих системных классах:
\classes\system\subsystems\models\data\ \classes\system\subsystems\models\hierarchy\ \classes\system\subsystems\streams\
происходит вызов методов из класса cacheFrontend, допустим:
$cacheFrontend = cacheFrontend::getInstance();
$cacheFrontend->save($element, "element");
метод getElement() в классе umiHierarchy.
В классе cacheFrontend, определяется текующий тип кеша, при вызове метода save() класса cacheFrontend, и включенном АРС, происходит вызов метода saveObjectData() в классе apcCacheEngine, файл:
\classes\system\subsystems\cache\engines\apc.php
В классе apcCacheEngine используются стандартные функции APC по сохранению данных, чтению, удалению и очистки всего кеша:
- apc_store
- apc_fetch
- apc_delete
- apc_clear_cache
Боле подробно ознакомиться с данными функциями и настройками APC можно на официальном сайте php.net
Umi.cms кеширует объекты, элементы, типы данных, значения полей и не только. В зависимости от типа сохраняемого значения формируется название ключа, по которому потом можно будет получить данные. Возможны примерно следующие варианты ключей:
27612_object__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde 50_element__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde 8873_field__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde 27607.32_property__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde 697_object_type__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde
27612_object – начальная информация об объекте с $object_id = 27612, в самой umi, в базе данных это таблица cms3_objects.
50_element – данные о страницы с $page_id = 50, таблица cms3_hierarchy.
8873_field – информация о поле c id=8873, таблица cms3_object_fields.
27607.32_property – объект с $object_id = 27607, 32 – id поля, таблица в БД cms3_object_content.
697_object_type – тип данных с $type_id = 697, таблица cms3_object_types
Информация по архитектуре базы данных: Архитектура базы данных системы
Как вы уже заметили, в самом конце названий ключей используется одно и тоже значение длиной в 40 символов, при получении данного значения используется переменная salt, в конфигурационном файле, config.ini. salt'a генерируется автоматически при установке системы.
Возможны также следующие префиксы для ключей:
- 1_domain – домен системы, таблица cms3_domains
- 1_lang – язык системы, таблица cms3_langs
- 2_template – шаблон системы (XSL или TPL), таблица cms3_templates
- 7_field_type – тип поля, таблица cms3_object_field_types
- 24_element_type – иерархический тип объекта, таблица cms3_hierarchy_types
При редактировании данных в административной части или через edit-in-place, происходит обнуление данных в кеше, соответственно обнуление только необходимых данных, а не всего кеша.
При запросе каких либо данных, происходит проверка, не хранятся ли уже необходимые данные в кеше, если да, то происходит загрузка данных из кеша, без каких-либо запросов к базе данных.
В том же классе umiHierarchy, в файле \classes\system\subsystems\models\hierarchy\umiHierarchy.php, в методе getElement(), происходит загрузка данных из кеша:
$cacheFrontend = cacheFrontend::getInstance();
$element = $cacheFrontend->load($element_id, "element");
сначала запускается метод load() класса cacheFrontend, а потом запускается метод loadObjectData($key) текущего класса кеша, для apc: /engines/apc.php