viernes, 7 de octubre de 2011

Utilizando Memcache en Symfony 1.4

Llevaba tiempo buscando un plugin para symfony 1.4 que permitiese cachear en Memcache en vez de en ficheros.

Encontré este, sfMemcachePlugin, pero parece que no está mantenido y no me he atrevido a instalarlo.

En mi aplicación sólo necesitaba cachear los resultados de una consulta especialmente pesada (es una cartelera de cine, la consulta consiste en cruzar todas las películas con todas las poblaciones donde hay cines que la tengan en cartelera).

Mi solución ha sido un tanto rudimentaria pero funciona muy bien:

Primero defino un método estático en una clase "Utilidades" que me devuelve un objeto memcache:
class Utilidades {
public static function getMemcache() {
$objMemcache = new Memcache;
$objMemcache->addServer('servidor1',11211);
$objMemcache->addServer('servidor2',11211);
/* etc */
return $objMemcache;
}
}


Después, en la clase que hereda de Doctrine_Table, defino el método que devuelve los resultados cacheados:

class FooTable extends Doctrine_Table {
public static function getConsultaCacheada() {
$clave = "FooTable-getConsultaCacheada";
$timeout = 3600;
$memcache = Utilidades::getMemcache();
$datos = $memcache->get($clave);
if(!$datos) {
$query = Doctrine_Query::create()->from('Tabla a')->where('...');
$datos = $query->fetchArray();
$objMemcache->set($clave, $datos, null, $timeout);
}
return $datos;
}
}


Super sencillo y funcional ;-)

Haría falta código adicional para controlar errores, etc, pero la idea básica es ésta. Se puede añadir algún parámetro al método como public static function getConsultaCacheada($nocache=false) para poder hacer consultas "frescas" sin tirar de Memcache si es necesario.

Más información del uso de Memcache en PHP en php.net/manual/en/book.memcache.php