
Установка 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;
}
*********************
Надеюсь, что это кому-то поможет…