grinderspro / memcached-cms-simplacms

Memcached в Simpla CMS

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Модуль memcached-cms-simpla.

Краткое описание

Разработан как класс-обертка над сервисом кеширования данных Memcached, для более удобного взаимодействия с API memcached, в стиле и по правилам CMS SimplaCMS. Это базовый класс, всю логику формирования и обработку полученных данных формирует программист. Обьект класса позволяет получить либо записать данные из memcached.

Подробнее в статье - http://grinderspro.ru/php/vnedryaem-memcached-na-simpla-cms.html

Новые файлы

api/Cache.php базовый класс

Измененные файлы

api/Simpla.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();

У нас будет:

  1. Строка SQL запроса $query
  2. Сам запрос $this->db->query($query) который нужно завернуть в конструкцию из условного оператора IF/ELSE
  3. Возвращение результата

About

Memcached в Simpla CMS

License:Other


Languages

Language:PHP 100.0%