Almacenar en caché datos de una base de datos


1Introducción

Este mini tutorial tiene como objetivo almacenar en caché los datos obtenidos de una base de datos.

Vamos a suponer que ya tienes un sitio web basado en Temma, con un controlador que muestra datos de una base de datos relacional.


2Configuración

En el archivo de configuración, vamos a añadir una fuente de datos correspondiente a un servidor Memcache.

Edita el archivo etc/temma.php:

<?php

return [
    'application' => [
        'dataSources' => [
            'db'    => 'mysql://user:pwd@localhost/base',
            'cache' => 'memcache://localhost',
        ],
    ],
];
  • Línea 6: Define la fuente de datos conectada a una base de datos MySQL.
  • Línea 7: Define la fuente de datos conectada a un servidor Memcache.

3Controlador

Imaginemos un controlador muy simple que muestra una lista de usuarios.
Aquí tienes un ejemplo de implementación:

<?php

/** Controlador de usuarios. */
class User extends \Temma\Web\Controller {
    /** Acción que muestra la lista de usuarios. */
    public function list() {
        // obtiene la lista desde la base de datos
        $users = $this->_loader->UserDao->search();
        // almacena la lista en una variable de plantilla
        $this['users'] = $users;
    }
}

Cada vez que se accede a la acción list, se ejecuta una consulta en la base de datos a través del objeto UserDao.

Ahora vamos a ver cómo podemos añadir un caché para evitar consultar la base de datos cada vez:

<?php

/** Controlador de usuarios. */
class User extends \Temma\Web\Controller {
    /** Acción que muestra la lista de usuarios. */
    public function list() {
        // define la clave de caché
        $cacheVarName = 'user:list';
        // obtiene la lista desde el caché
        $users = $this->cache->get($cacheVarName, function() {
            // este código se ejecuta si el valor no está en caché
            // obtiene la lista desde la base de datos
            return $this->_loader->UserDao->search();
        });
        // almacena la lista en una variable de plantilla
        $this['users'] = $users;
    }
}

Toda la información relacionada está disponible en la documentación del caché.