сохранить документ в кеш memcache

Aug 24, 2013

Суть идеи такова: сохранить ресурс в виде html странички в кеш memcache средставами MODX (плагином), посредством nginx прочитать ресурс из кеша, так сказать минуя MODX… Плюсы — nginx отдает страничку практически мгновенно, сервер не тратит ресурсы…

Нам нужно два события — OnSiteRefresh и OnBeforeSaveWebPageCache. По первому событию чистить кеш, по второму сохранить ресурс в кеш.

Скелет плагина:

switch ($modx->event->name) {
    case 'OnSiteRefresh':
        //чистим кеш
        break;
    case 'OnBeforeSaveWebPageCache':
        if ($modx->resource->get('cacheable') && $modx->resource->get('published') && $modx->resource->_output != '') {
        
            $memcache = new Memcache;
            $memcache->connect('localhost', 11211);
            $expire = 50;//время хранения 50с
            $uri = $modx->resource->get('uri'); 
            $context = $modx->context->get('key');
            $key = "$context/$uri";
            
            $output = &$modx->resource->_output;
            $time = time();
            $cacheArray = array('output'=>$output, 'time'=>$time);
            $tmp_object = $output;
            $memcache->set($key, $tmp_object, false, $expire);
            $memcache->close();

        break;
        }
}

Запись в кеш:

$memcache = new Memcache;
$memcache->connect('localhost', 11211);//подключаемся к memcache
$expire = 50;//время хранения 5с кеша
$tmp = "<h1>привет</h1>";
$memcache->set('key', $tmp, false, $expire);//записываем по ключу значение в кеш
$memcache->close();//закрываем подключение

Получить значение (страничку) из кеша пока на время проб, просто снипетом:

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Не могу подключиться");
$get_result = $memcache->get('key');
echo "Данные из кеша:".$get_result."
\n";
$memcache->close();

Ключ формировать по следующему шаблону: site_name:context:uri

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

p.s. хотел донести до вас основную мысль, интересно выслушать ваше мнение… я не программист и возможно это вообще бредовая идея… Жду ваши коментарии…