Пользователь
0,0
рейтинг
18 августа 2014 в 17:26

Разработка → Memcached в PHP Kohana и его тестировние из песочницы

Уже много описано про memcache, однако я помучался прежде чем нашел оптимальный вариант для одного проекта на PHP, достаточно ресурсоемкого с большим объемом расчетов в Kohana.

Memcache пришлось отфутболить сразу же, так как когда ключей набегает пару сотен, нереально отследить, когда и какой ключ нужно убить. Смотрел в сторону MemcacheTag, где применено использование тэгов для объединения нескольких ключей, однако он оказался слишком сырым и весьма неудобным для работы. В конце концов был найден самый, на мой взгляд, оптимальный вариант работы с memcached.

Описание принципа работы данной технологии лучше всего посмотреть здесь или в первоисточнике.

Я же напишу как подключать и использовать в фреймворке Kohana, каким образом отследить ключи кэшей и собственно протестировать как работает кэширование в проекте.

Итак, начнем:

В bootstrap раскомментировать 'cache'=> MODPATH.'cache', добавить файл MODPATH/cache/classes/Cache/Memcacheimp.php
вот такого вида:

class Cache_Memcacheimp extends Kohana_Cache_Memcacheimp {}


Добавить файл MODPATH/cache/classes/Kohana/Cache/Memcacheimp.php.

Ниже файл для скачивания.

Скопировать MODPATH/cache/config/cache.php, вставить его в application config и добавить туда, как последний элемент массива, следующий код:

'memcacheimp' => array(
		'driver'             => 'memcacheimp',
		'default_expire'     => 3600,
		'compression'        => FALSE,              
		'servers'            => array(
			'local' => array(
				'host'             => 'localhost', 
				'port'             => 11211, 
				'persistent'       => FALSE,  
				'weight'           => 1,
				'timeout'          => 1,
				'retry_interval'   => 15,
				'status'           => TRUE,
			),
		),
		'instant_death'      => TRUE,  
		'statistics'      => FALSE,
	)


где установлены стандартные элементы по умолчанию для кэширования, кроме ключа 'statistics', который я добавил для тестирования. Он включает и выключает тестирование нашего memcached.

Все теперь можно работать.

Вызов метода:

Model_SomeClass::factory('table')->get($id, 'key_tag');

где key_tag — объеденяющий тег для нескольких ключей

Создаем объект:
$this->cache = Cache::instance('memcacheimp');


Таким образом, создаем cache в модели:
 public function get($id, $tags = null) 
{
	
	$cOne = $this->cache->get("get_{$this->_table}_{$id}");

	if (!is_array($cOne)) 
	{
		$query = DB::query(Database::SELECT, "SELECT * FROM $this->_table WHERE id='$id'");

		$cOne = $query->execute()->as_array();
		$this->cache->set("get_{$this->_table}_{$id}", $cOne, array($tags));
	}
	
   return $cOne;
}


Так убиваем cache c ключами объедененными тегом key_tag:
$this->cache->delete_tag('key_tag');


Чтобы убить весь cache или удалить по ключу, пользуемся стандартными методами cache, так как наш класс наследуется от Cache.

Для того, чтобы проследить процесс работы нашего кеширования и понять, какие ключи у нас создаются, изменим немножко конфиг:
'statistics'      => TRUE,


Теперь мы можем посмотреть, что происходит с нашим кэшем. Открываем APPPATH/cache/statistics/ и смотрим содержимое файла get_someTable_someId.txt, где get_someTable_someId — имя нашего ключа.

содержимое файла:
MLWHHHHH

М — кэш отсутствует
L — установлена блокировка ключа
Н — успешный запрос кеша

То есть, наш кеш прекрасно работает.

Ну и результат до кеширования:

image

Кеширование включено:

image

Как видно, довольно таки тяжелая страница с множеством обращений к базе грузится за 0,455 сек. против 1,7 сек. до кеширования

Скачать Memcacheimp.php можно здесь.
@navikom
карма
0,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (3)

  • 0
    По моему мнению, для этого очень хорошо подходит Redis. Уверен, что где-нибудь на гитхабе есть модуль под Кохану. Я сам как-то писал такой модуль, правда под старую версию (2.4)
  • –1
    Здравствуйте, не по теме но все же, на smetaon.ru у вас несколько ajax окон, замените их на главной на обычный текст и не придется ждать крутящееся окно, это должно улучшить восприятие сайта =)
    По теме вот так вот на кохана не делают:

    $this->_default_config = array(
    'host' => 'localhost',
    'port' => 11211,
    'persistent' => FALSE,
    'weight' => 1,
    'timeout' => 1,
    'retry_interval' => 15,
    'status' => TRUE,
    'instant_death' => TRUE,
    'failure_callback' => array($this, '_failed_request'),
    );
    используйте Встроенный конфиг можно использовать вот так:

    $config = Kohana::$config->load('my_group');
    $value = $config->get('var');

    Если у Вас на экране код вперемешку в стекстом, то есть нет выделения кода, всему виной администрация сайта, не надо минусов
    • 0
      согласен, нужно взять из собственного конфига, поправляю

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.