Разработан как класс-обертка над сервисом кеширования данных Memcached, для более удобного взаимодействия с API memcached, в стиле и по правилам CMS SimplaCMS. Это базовый класс, всю логику формирования и обработку полученных данных формирует программист. Обьект класса позволяет получить либо записать данные из memcached.
Подробнее в статье - http://grinderspro.ru/php/vnedryaem-memcached-na-simpla-cms.html
api/Cache.php базовый класс
Загрузим новый файл api/Cache.php в место назначения.
Добавим класс Cache в список доступных подклассов Simpla. После строки (38)
'managers' => 'Managers',
добавим
'cache' => 'Cache'
В классе Cache есть свойство, которое говорит само за себя:
private $config = [
'host' => '127.0.0.1',
'port' => 11211,
'extension' => 'memcached', // or memcache
'lifeTimeCache' => 86400,
];
Массив с настройками. По умолчанию предпологается использование memcached
Можно использовать как в контроллерах, так и в моделях API (речь о терминологии MVC). Чаще всего конечно memcached необходимо использовать в API (моделях), так как именно в моделях происходит получение, формирование и предоставление данных, как правило с запросами в базу данных.
Простой пример:
$data = 'Тестовая строка для mem';
$this->cache->set('key', $data);
echo $this->cache->get('key');
В следующем примере закешируем запрос к БД. Для примера возьмем класс api/Brands.php и его метод get_brands(), который получает список брендов, исходя из условий переданных в качестве параметра.
В стандартном виде мы имеем следующий код ближе к концу метода
...
// Выбираем все бренды
$query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image
FROM __brands b $category_id_filter ORDER BY b.name");
$this->db->query($query);
return $this->db->results();
...
Нас интересует конкретно строка запроса к БД, а именно:
$this->db->query($query);
Обернем ее в условный оператор IF:
if($result = $this->cache->get($query)) {
return $result; // возвращаем данные из memcached
} else {
$this->db->query($query); // иначе тянем из БД
$this->cache->set($query, $this->db->results(), false, 86400); //помещаем в кеш
}
Итого будет получаться всегда для всех запросов одна и та же картина:
// Выбираем все бренды
$query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image
FROM __brands b $category_id_filter ORDER BY b.name");
if($result = $this->cache->get($query)) {
return $result; // возвращаем данные из memcached
} else {
$this->db->query($query); // иначе тянем из БД
$this->cache->set($query, $this->db->results(), false, 86400); //помещаем в кеш
}
return $this->db->results();
У нас будет:
- Строка SQL запроса $query
- Сам запрос $this->db->query($query) который нужно завернуть в конструкцию из условного оператора IF/ELSE
- Возвращение результата