Добавление нового кеширующего механизма в 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)'
Вывод.
Большого смысла делать такую манипуляцию специально - нет. Но если по каким-то причинам нужно использовать нестандартный кешер, то может пригодиться.
Все же, это одна из тех вещей за которые я люблю ЮМИ - легкость расширения.