Kohana: la gestion du cache (caching)

Le "caching" est une technique permettant de mettre en cache le résultat de certaines parties de vos scripts afin de les recharger (beaucoup) plus vite ultérieurement. C'est très utile pour diminuer le temps de chargement de vos scripts php sur votre serveur. Cet article présente brièvement les fonctionnalités de mise en cache de Kohana ainsi qu'une façon de mettre en place une mise en cache automatique grâce à un hook.

Kohana intègre un système de cache assez souple et extensible. Il fonctionne à base de drivers qu'on pourrait aussi voir comme des conteneurs:

  • APC - Alternative Php Cache
  • Eaccelerator
  • File (Fichier)
  • Memcache
  • SQlite (Base de données)
  • Xcache

En fonction du driver choisi, les fonctionnalités disponibles peuvent varier. Par défaut le cache est stocké dans des fichiers; c'est rapide et robuste. De plus on peut:

  • Donner un nom au cache
  • Choisir la durée pour chacun des caches que l'on fait
  • Tagger un cache avec des mots-clé. Permet de retrouver un ensemble de cache et d'effecteur des opérations dessus (typiquement les supprimer).

Vous trouverez plus d'informations dans la doc de Kohana sur la manière d'implémenter le système de cache

Mise en cache automatique des pages statiques

Pour un petit site où les pages sont très statiques, il est intéressant de mettre en cache toute la page html pendant une période de temps assez longue. La page mise en cache est ainsi rechargée beaucoup plus rapidement et ce jusqu'à son expiration.

Dans Code igniter, c'est très simple (appel à $this->output->cache(n); dans le contrôleur à mettre en cache) et d'ailleurs c'était l'unique façon de mettre en cache qqch. Dans Kohana, c'est un peu plus complexe. Il va falloir créer un hook pour faire cela mais une fois créé tout est automatique.

Woody Gilk (alias Shadowhand), le leader du projet Kohana, a crée un petit screencast vraiment top pour effectuer cette mise en cache. Elle est effectuée grâce à un hook qui va créer pour chaque URL appelée un fichier de cache dont le nom est l'URL en question. Si ce fichier de cache existe alors il est directement affiché, sinon le déroulement est normal càd appel du controleur, des vues, etc.., mise en cache de la page et rendu de celle-ci.

La vidéo au format QuickTime video: h264, AAC. Environ 13 Mo

Pour ceux qui veulent un tutorial textuel, le voici.

Il convient tout d'abord d'activer le support des hooks. Pour cela, dans le fichier system/config/hooks.php changer la valeur à vrai:

 
$config['enable'] = TRUE;

Ensuite créer le hook, qu'on appellera page_cache.php à placer dans application/hooks et contenant le code ci-dessous. Il est commenté pour bien comprendre ce qu'il fait.

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php defined('SYSPATH') or die('No direct script access.');
 
class hook_page_cache {
 
    private $cache;
 
    public function __construct()
    {
        // Instancie la librairie de gestion du cache
        $this->cache = new Cache;
 
        // Nous avons besoin de savoir l'URI afin de mettre la page correspondante en cache. On attache donc le chargement du cache à l'événement system.routing juste avant la méthode setup.
        Event::add_before('system.routing', array('Router', 'setup'), array($this, 'load_cache'));
    }
 
    // fonction de chargement du cache s'il existe
    public function load_cache()
    {
        // Vérifie si le cache de la page courante existe
        if ($cache = $this->cache->get('page_'.Router::$current_uri))
        {
            // Affiche le contenu du cache et s'arrete la
            Kohana::render($cache);
            exit;
        }
        else
        {
            // On attache la fonction du création du cache à la fin de l'événement system.display
            Event::add('system.display', array($this, 'save_cache'));
        } 
    }    
 
    // fonction de mise en cache de la page
    public function save_cache()
    {
        $this->cache->set('page_'.Router::$current_uri, Event::$data);
    }
}
 
// Initialise la classe
$hook = new hook_page_cache;
unset($hook);

Router::$current_uri contient l'URI courante
Event::$data contient le rendu de la page après être passé par le contrôleur.

Vous pouvez télécharger le fichier page_cache

Mise en cache de contenu dynamique

Pour un site où le contenu est très dynamique, il est déjà plus dur de mettre en cache du contenu et surtout de définir la durée pendant laquelle le cache va être gardé avant d'être réactualisé. Il faut donc identifier les parties du site qui sont à même de peu bouger et les mettre en cache sur de courtes périodes.

A lire également

Filed under: Kohana, PHP
Tags: , , ,

Leave a Reply