Skip to content

Implementación con httpmemcachedmodule

exos edited this page Jan 31, 2013 · 3 revisions

Se puede, utilizando una feature por ahora experimental, implementar la cache para ser servida directamente por Nginx con el módulo HttpMemcachedModule, esta usa la url como key final, pudiendo generar cache que levantará Nginx, sin ejecutar ningún script.

Utilizando

Para utilizar se necesitará utilizar la clase PageCache, hecha para cachear páginas enteras (todo el contenido) de forma natural.

Hay métodos para manejar la forma en que HybridCache encodea las keys que utilizará para los storages. En este caso en vez de utilizar sha1 como hace por defecto, se necesita utilizar una key en texto claro.

Desde PHP

// Cargamos el autoloader de clases
require('HybridCache/lib/init.php');

use Hybrid\Cache;
use Hybrid\PageCache;
use Hybrid\storages\Memcache as MemcacheSotorage;

// Creamos el storage
$storage = new MemcacheSotorage();

// Seteamos que guarde en claro
$storage->setFormat(MemcacheSotorage::F_CLEAN);

// Agregamos el storage media
Cache::addStorageMedia( $storage );

// Creamos la instancia de PageCache
$page = new PageCache();

// Le definimos que encodee las key de forma reconocible por Nginx
$page->setKeyEncodeMethod( Cache::K_UNSERIALIZED_URL );

// Seteamos saveClean para que no guarde metadata, solo el contenido
$page->saveClean(true);

$page->run();

/* Resto del contenido */

De esta forma. la key final en Memcache va a ser la url completa.

Configurando Nginx con HttpMemcachedModule

Primero necesitaran tener instalada una versión de Nginx con dicho módulo, si necesitan una mano para compilar Nginx en Debian les recomiendo este articulo: http://exodica.gentisoft.com.ar/posts/336-compilando-nginx-en-debian.html, tambien obviamente necesitan tener un memcached corriendo.

Una vez preparado el escenario, hacemos uso de esta forma:

location / {
    set $memcached_key "$host$uri";
    memcached_pass     localhost:11211;
    default_type       text/html;
    error_page         404 = @fallback;
}

location @fallback {
    ### Y aca va el proxy_pass o el fastcgi_pass
}