Mettre en cache les données de base


1Présentation

Ce mini-tutoriel a pour but de mettre en cache les données provenant d'une base de données.

Nous partirons du principae que vous avez déjà un site basé sur Temma, avec un contrôleur qui affiche des données provenant d'une base de données relationnelle.


2Configuration

Dans le fichier de configuration, nous allons ajouter une source de données correspondant à un serveur Memcache.

Éditez le fichier etc/temma.php :

<?php

return [
    'application' => [
        'dataSources' => [
            'db'    => 'mysql://user:pwd@localhost/base',
            'cache' => 'memcache://localhost',
        ],
    ],
];
  • Ligne 6 : Définition de la source de données connectée à une base MySQL.
  • Ligne 7 : Définition de la source de données connectée à un serveur Memcache.

3Contrôleur

Imaginons un contrôleur très simple, qui se contente d'afficher une liste d'utilisateurs.
Voici un exemple d'implémentation :

<?php

/** Contrôleur des utilisateurs. */
class User extends \Temma\Web\Controller {
    /** Action servant à afficher la liste des utilisateurs. */
    public function list() {
        // récupération de la liste en base de données
        $users = $this->_loader->UserDao->search();
        // enregistrement de la liste dans une variable de template
        $this['users'] = $users;
    }
}

À chaque accès à l'action list, une requête est faite sur la base de données, via l'objet UserDao.

Voyons maintenant comment nous pouvons mettre du cache, pour ne pas utiliser la base de données à chaque fois 

<?php

/** Contrôleur des utilisateurs. */
class User extends \Temma\Web\Controller {
    /** Action servant à afficher la liste des utilisateurs. */
    public function list() {
        // définition de la variable de cache
        $cacheVarName = 'user:list';
        // récupération de la liste en cache
        $users = $this->cache->get($cacheVarName, function() {
            // si la liste n'est pas en cache, ce code est exécuté
            // récupération de la liste en base de données
            return $this->_loader->UserDao->search();
        });
        // enregistrement de la liste dans une variable de template
        $this['users'] = $users;
    }
}

Toutes les informations sont disponibles dans la documentation du cache.