Memcached es un sistema que se ejecuta en modo servicio que almacena en memoria RAM cualquier dato que se le pida. Las llamadas se hacen por medio de sus librerías en los diferentes lenguajes de programación que soporta y el almacenamiento lo realiza por medio de asociaciones de series de cadenas hash. De esta manera, si yo tengo en mi código por ejemplo un listado completo de provincias que voy a mostrar a los usuarios en una página, en vez de estar todas las veces sacándolas de la Base de Datos, las saco una sola vez -la primera vez que se pidan- y las guardo posteriormente en Memcache. La siguiente vez que me las pidan, miro primero si las tengo en Memcached y las muestro directamente desde él.Para poder usarlo, suponemos que tenemos ya un servicio memcached instalado y que queremos asociar nuestro código a él. Esto lo realizamos cargando primero las librerías memcached dentro de nuestro PHP:
$ pecl install memcache
En nuestro fichero de php.ini insertamos la línea -si no lo ha hecho ya pecl:
extension=memcache.so
Una vez instaladas las librerías, podemos llamar a la clase Memcache desde dentro del código. Lo primero que tenemos que hacer es declarar la clase:
$memcache = new Memcache();
$memcache->pconnect('localhost',11211);
Aqui supongo que el servicio Memcache está situado en el mismo servidor. Según la documentación de Memcache, el puerto por defecto es el 11211, por lo que usaremos el mismo.
Ahora que estamos conectados, sólo queda usarlo. Por ejemplo, aquí tengo una función que me devuelve las provincias de España:
function get_provincias($pais) {
$prov = $memcache->get("PROV_".$pais);
if ( $prov === false) {
// No está en memcache, así que las traigo de la BBDD y las meto en
// memcache para la siguiente vez...
$prov = coge_de_base_datos_provincias($pais);
$memcache->set("PROV_".$pais,$prov,0,0);
}
return $prov;
}
Todos los hilos de PHP que corran podrán acceder a la información que otros hilos han dejado dentro del servicio. Por lo que hay que tener cuidado con los accesos y la información que se pueda introducir.
Como podéis observar, es cuestión de mantener una lógica lo sufientemente sencilla como para no confundirse a la hora de manejar los datos. Otro detalle que habréis notado es que he usado dos métodos de la clase Memcache. En realidad los que suelo usar son estos dos nada más. Existen otros muy útiles también como set(), replace(), invalidate().
Este último existe porque tú también puedes definir a Memcache el tiempo máximo que quieres que esa entrada se encuentre en la memoria. Así se pueden mantener datos temporales en memcache como información de la sesión de un usuario. Este valor está definido en segundos por el cuarto parámetro de la función set(). Pero os remito a la documentación que hay aquí para profundizar más en este aspecto.
Memcached es una herramienta muy útil que hará que nuestras aplicaciones web no tengan que esperar esos 10ms a la base de datos ya que este servicio tiene tiempos de respuesta por debajo del milisegundo en muchas ocasiones.