Разработка сайтов на UMI.CMS
Знать UMI.CMS в совершенстве невозможно.
Даже сами разработчики знают о ней не все...

UMi

Ursa Minor

Добавление нового кеширующего механизма в UMI.CMS

Дата публикации 01.08.2014

Версия системы: 2.9.5

 

Как известно, UMI.CMS поддерживает несколько кеширующих механизмов, в том числе memcached. К сожалению, есть нюанс. Существует два модуля  PHP для работы с демоном memcached: php5-memcache и php5-memcached. UMI.CMS поддерживает первое. По сути, в подавляющем большинстве случаев достаточно и его, но исторически сложилось, что я начал использовать php5-memcached раньше и, когда пришлось на уже настроенные работающие сервера ставить ЮМИ, возник вопрос: либо менять расширение для всех, либо доработать ЮМИ. Я решил доработать ЮМИ.

 

Кеширующие механизмы находятся в папке /classes/system/subsystems/cache

Для начала создадим обработчик. В папке /classes/system/subsystems/cache/engines дублируем класс memcache.php  и называем копию memcached.php

Открываем его и меняем название на memcachedCacheEngine:

class memcachedCacheEngine implements iCacheEngine {

 Меняем метод connect():


protected function connect() {
	if(class_exists("Memcached")) {

		$memcache = new Memcached();
		if($memcache->addServer('/var/run/memcached/memcached.sock',0)){
			$this->memcache = $memcache;
			$this->connected = true;
			return true;
		}
		return false;
	} else {
		return false;
	}
}

Здесь я использовал подключение через unix-сокет /var/run/memcached/memcached.sock, как описано в этой заметке

 

Меняем метод saveRawData:


public function saveRawData($key, $string, $expire) {
	return $this->memcache->set($key, $string, $expire);
}

 

Все,  идем подключать новый класс к фронтенду.

Открываем cacheFrontend.php (увы, придется вносить изменения в системный класс. Надеюсь, разработчики в будущем это учтут) и дописываем новое имя memcached в:


public static function getPriorityEnginesList($enabledOnly = false) {
	$list = Array('apc', 'eaccelerator', 'xcache', 'memcache', 'memcached', 'fs');
	if($enabledOnly) {
		foreach($list as $i => $engineName) {
			if(self::checkEngine($engineName) == false) {
				unset($list[$i]);
			}
		}
	}
	return $list;
}


protected function checkEngine($engineName) {
	switch($engineName) {
		case "apc": {
			return function_exists("apc_store");
		}

		case "eaccelerator": {
			return function_exists("eaccelerator_put");
		}

		case "xcache": {
			return function_exists("xcache_set");
		}

		case "memcache": {
			return class_exists("Memcache");
		}
		case "memcached": {
			return class_exists("Memcached");
		}

		case "shm": {
			return function_exists("shm_attach");
		}

		case "fs": {
			return true;
		}

		default: {
			return false;
		}
	}
}

 

В /classes/modules/config/i18n.php дописать челевекопонятное название для админки:

'cache-engine-memcached' => 'Memcached (Is not Memcache)'

 

Вывод. 
Большого смысла делать такую манипуляцию специально - нет. Но если по каким-то причинам нужно использовать нестандартный кешер, то может пригодиться.
Все же, это одна из тех вещей за которые я люблю ЮМИ - легкость расширения.

Новости

30.10.2016

Обновлено описание макроса для вывода всех элементов справочника UMI.CMS с учетом версии 14.

 

21.07.2015

Памятка по обновлению до debian 8.1. Приятно вкусить все плюшки PHP 5.6

11.11.2014

Как выполнить SQL-запрос из bash-скрипта. Памятка

11.11.2014

Как отследить нагрузку сайта на сервер.

06.11.2014

Заготовка для галереи изображений с прокруткой. Не знаю, когда дойдут руки довести ее до вида плагина, поэтому открываю как есть. Можно доработать.

05.11.2014

Выкладываю как заготовку свой слайдер изображений на mootools

Все обновления