Установка Memcached на Ubuntu для PHP и его использование в kohanaframework

Тут будет рассмотрена установка демона Memcached на систему c Ubuntu для его использования в php. А также использование memcache во фреймворке kohana.

Memcached (Memcache) - ПО, которое позволяет кэшировать данные в оперативной памяти сервера, на котором запущен демон memcached, и устанавливать время жизни кэша.

Основная причина использования memcache - увеличение производительности сайта. Пути повышения производительности:

  • кэширования страницы. После генерации страницы положить результат в кэш, например на сутки. Когда пользователи будут запрашивать страницу, то, если она есть в кэше, страница будет отдаваться из кэша. Снижается нагрузка на сервер, который тратит ресурсы для генерации страницы. Есть одно но, если страница динамичекая, то при изменении данных на странице, нужно обновлить кэш этой страницы, чтобы пользователям отдавались только актуальные данные. Если страница очень динамическая, то такое использование может не принести пользы, т.к. будут происходить постоянные перезаписи кэша.
  • кэширование результатов выполнения тяжёлых запросов. Например, на титульной странице сайта выводятся несколько фоток с высоким рейтингом (рейтинг нассчитывается по по множеству параметров - просмотры, лайки, комменты и т.д.). Рационально будет после выполнения запроса получения популярных фоток закэшировать результат, например на час. За час кардинально ничего не изменится, зато вместо 500 раз тяжёлый запрос выполнится всего лишь один раз.

Для начала нужно установить службу Memcached:

sudo apt-get install memcached

По умолчанию, сервис Memcached запускается на порту 11211. Если захотите, порт можно изменить.

Установить php-расширение для работы с Memcache:

sudo apt-get install php5-memcache

Далее нужно сделать restart php, если php подключен как модуль apache то:

sudo /etc/init.d/apache2 restart

Если используете php-fpm:

sudo service php5-fpm restart

После рестарта в phpinfo() должна добавиться секция memcached:

phpinfo memcached

Если секция не добавлена, то в kohana при попытке работать с memcache вылазит ошибка:

Cache_Exception [ 0 ]: Memcache PHP extention not loaded


Работа с кэшем в kohana

Для работы с кэшем в kohana уже есть модуль cache. Его нужно раскомментировать в bootstrap.php. 

Скопировать из модуля cache modules/cache/config/cache.php в application/classes/config/cache.php, чтобы перекрыть конфиг. В самом файле config/cache.php раскомментировать секции типов кэша, которые будем использовать.

Теперь можем использовать кэш. 
Обратиться к кэшу можно из любого места в коде, но, естественно, делать это лучше из контроллера или модели. Если проект большой, то для работы с каждым ключём кэша лучше создать класс-slot. И тогда работа со слотом всегда будет в одном месте.

В общем случае использование memcache в kohana:

Cache::instance('memcache')->set('key_for_cache', $data, Date::DAY);
Cache::instance('memcache')->get('key_for_cache');  // тут будет $data

Если ключ кэша не найден, то get() вернёт NULL.

Кэш будет храниться и после обновления страницы, пока что то не сломается или не истечёт время жизни кэша. Третим параметром в set() можно установить время жизни кэша.

Реальный пример:

const COUNT_LAST_USERS = 6;    // кол-во последних добавленных юзеров
const TIME_CACHE_LIFE = 86400; // 1 day - время жизни кэша 

public function getLastUsers() {
    $aUsers = Cache::instance('memcache')->get('lastUsers');   // берём из кэша
    if (!is_array($aUsers)) {  // если в кэше не найдены данные (тогда $aUsers NULL)
        // тяжёлый sql-запрос без использования индекса 
        $aUsers = $this->where('sex', '=', 1)
            ->order_by('date_added', 'desc')
            ->limit(self::countLastUsers)
            ->find_all();
        Cache::instance('memcache')->set('lastUsers', $aUsers, self::TIME_CACHE_LIFE); // ложим в                                                                      кэш  
    }  
    return $aUsers;
}   

При первом обращении к функции getLastUsers() данные не будут найдены в кэше и запрос пойдёт в базу, в остальных вызовах в течение суток данные будут браться из кэша.

 
 
 
 

icon Комментарии 0

Ваш комментарий к статье.. (для авторизованных)

ctrl+enter

icon Вход в систему

зарегистрироваться
НОВЫЕ ПОЛЬЗОВАТЕЛИ