Pull to refresh

Немного о Memcached для MODx Revolution

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

Установка Memcached, на дистрибутив Linux довольно прост:
Ubuntu : sudo apt-get install memcached
Gentoo : sudo emerge install memcached
Redhat : sudo yum install memcached

Вы можете установить объем памяти, зарезервированный для Memcached, в файле конфигурации (/etc/memcached.conf). — 64 Мб выделяется по умолчанию. Конфигурационный файл содержит IP-адрес и порт Memcached. Значения по умолчанию ( 127.0.0.1 и 11211 ), это настройки для стандартной установки.
Мы хотим, чтобы данные для хранения извлекались из PHP скриптов. Это означает, что мы должны как-то подружить Memcached с PHP. Для этого мы устанавливаем расширение для PHP — PECL, это очень легко установить введя следующую команду:
sudo pecl install memcache
Включаем memcached запуская команду в консоли
memcached -d -m 1024 -l 10.0.0.1 -p 11211 — где 10.0.0.1 — поменять на IP сервера (11211 — это порт).
Расширяем xPDO объект в конструкторе пользовательского класса, инициализируя и подключаясь к Memcached следующим образом:
class MyXPDO extends xPDO
{
function __construct($dsn, $username= '', $password= '', $tablePrefix= '', $driverOptions= null)
{
parent::__construct($dsn, $username, $password, $tablePrefix, $driverOptions);

// Установливаем кэширования с использованием Memcache.
$this->config = array_merge(array('cache_db_handler' => 'Memcache'), $this->config);

// Подключение к кеш-менеджеру.
if ($cacheManager = $this->getCacheManager())
$cacheManager->objcache->connect('10.0.0.1', 11211);
}
}

Итог:
Теперь, когда вы хотите кэшировать объект, просто укажите время жизни кэша. Например:
// получить пользователя и кэшировать их на 30минут
$user = $xpdo->get('User', array('id' => $modx->getUserLoginID()), 1800);

xpdo будет обрабатывать детали кэширования объектов memcached, как раз задаётся времянем кэшая, и будет автоматически извлекать объекты из кэша, если объекты еще в кэше.
Хорошо, с объектами всё понятно, а если нужно кэщировать страницу (объекты, заголовки ...)?
Приведу пример с Articles
include_once(/path/to/MyXPDO.class.php)
$xpdo = $MyXPDO();

echo getRecentArticles($xpdo, 5);// echo - это условно для примера, чтобы вы поняли, лучше использовать return

function getRecentArticles($xpdo, $num)
{
// Во-первых, проверяем, есть ли данные в кэше
if($cacheManager = $xpdo->getCacheManager())
{
// Создает ключ, уникальный ключ будет создан в зависимости от параметров переданной функции.
$key = md5('blogs::getRecentArticles: num: '.$num);

// Если HTML еще не в кэше, установливаем ключ, чтобы мы могли кэшировать результат после ее получения.
if ($html = $cacheManager->get($key))
{
return $html;
}
else
{
$inCache = false;
}
}

// Если не в кэше, так что выполняем запрос, и кэшируем конечный результат
$sql = 'SELECT ...';
// после получения данных и обработанных с помощью чанков и шаблона, конечный формат вывода поместим в $html
$html = ...

if (is_object($cacheManager) && !$inCache)
$cacheManager->set($key, $html, 1800);

return $html;
}

*********************

Надеюсь, что это кому-то поможет
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.