Table des matières

Le Caching

Comment celà fonctionne t’il?

Quand vous appelez patTemplate::readTemplatesFromInput(), patTemplate vas inclure et instancier le reader désiré lequel vas charger et analyser le template que vous aurez choisit. Il vas l’être à chaque fois que le template est demandé bien que le processus ne soit pas influencé par des variables ou action de l’utilisateur.

Cette technique a deux inconvégnients:

1. La classe de reader constitue + de 1400 lignes de code, lesquelles sont compilées.

2. Le reader utilise la marque de preg_* sur les fonctions, ceci permet d’obtenir la consommation en temps.

Pour pouvoir se débarasser des freins à l’exécusion, j’ai implémenté un sytème de cache pour les templates, lequel implémente des fonctionnalités très simple: Après l’analyse du template par le reader et les retours dans un tableau contenant la structure, le cache du template vas sérialiser les demandes du cache template, autrement il sera stocké dans une structure avec une clé spécifique. Si oui, il vas être désérialisé et utilsé au lieu d’être lu à nouveau par le template.

Utilisation du cache template

Comme tous modules patTemplate, l’utilisation du cache template est facile. Basiquement, vous avez juste besoin d’ajouter une ligne de code dans vos scripts.

01        <?PHP
02        require_once 'pat/patErrorManager.php';
03        require_once 'pat/patTemplate.php';
04       
05        $tmpl = &new patTemplate();
06        $tmpl->setRoot( 'templates' );
07       
08        /**
09        *Utilise un cache template basé sur un système de fichier
10        */
11        $tmpl->useTemplateCache( 'File', array(
12                                                'cacheFolder' =>'./tmplCache',
13                                                'lifetime' =>60 )
14                                              );
15       
16        $tmpl->readTemplatesFromInput( 'page.tmpl', 'File' );
17       
18        $tmpl->displayParsedTemplate();
19        ?>

Le premier paramètre dans l’appel de useTemplateCache() définis quel cache devra être utilisé. Si vous n’êtes pas sûr de vous, des caches que vous avez à installer, regardez dans le répertoire patTemplate/TemplateCache. Le second paramètre est un tableau avec tous les paramètres pour le cache template. Vous pouvez consulter la documentation sur le cache template que vous utilisez par une liste de tous les paramètres supportés.

Dans l’exemple on utilise le cache ‘File’, il a deux paramètres:

Définir cacheFolder, où le fichier de cache vas être enregistré? Définir lifetime, Combien de temps le cache est valide? Dans ce cas, nous utiliserons un cache de 60 secondes. Vous pouvez également initialiser le cache à ‘auto’, si vous cherchez à ce que le cache soit reconstruit quand le fichier source est modifié.

Créer un nouveau cache template

patTemplate est énorme avec un cache template, c’est les données enregistrées dans le système de fichier. Si vous avez besoin d’un conteneur rapide d’enregistrement, préféré la mémoire partagé, vous pouvez plus facilement l’implémenter.

Créez un nouveau fichier dans patTemplate/TemplateCache et créez une classe qui étends patTemplate_Cache. Dans la classe, vous avez juste besoin d’implémenter les méthodes qui suivent:

array patTemplate_TemplateCache::load( string key, int modificationTime )

boolean patTemplate_TemplateCache::write( string key, array templates )

La méthode load() vas recevoir une clé unique aussi bien que son temps quand le fichier original va être modifié, si le reader soutient le dispositif. Vous aurez à contrôler, si c’est un fichier pour une clé spécifique et si elle est toujours valide. Si le fichier est valide, vous allez pouvoir désérialiser les données enregistrées et retourner le résultat de la structure du template de patTemplate.

La méthode write() vas recevoir une clé unique, tout comme la structure du template qui a été enregistré. Simplement séréaliser ceci et l’enregister avec sa clé, ainsi il peut être charger vers un point ultérieur.

Jettez un coups d’oeil au code.

Pour saisir entièrement, comment travail le cache template, jettez un oeil au cache ‘File’:

01        <?PHP
02        /**
03        * patTemplate Template cache that stores data on filesystem
04        *
05        * Les paramètres possible pour le cache sont:
06        * - cacheFolder : indique le répertoire par lequel vas être chargé le cache
07        * - lifetime : le nombre de secondes pour lequel le cache est valide. Si c'est sur 'auto', il sera analysé
08        *   si le cache est plus ancien que le fichier original (si le reader supporte ceci)
09        *
10        * @package       patTemplate
11        * @subpackage    Caches
12        * @author        Stephan Schmidt <schst@php.net>
13        */
14        class patTemplate_TemplateCache_File extends patTemplate_TemplateCache
15        {
16           /**
17            * Les paramètres de cache
18            *
19            * @access    private
20            * @var        array
21            */
22            var $_params = array(
23                                 'cacheFolder' =>'./cache',
24                                 'lifetime'       =>'auto'
25                                );
26       
27           /**
28            * Charge le template venant du cache
29            *
30            * @access   public
31            * @param    string           la clé du cache
32            * @param    integer          modification du temps pour le template original
33            * @return   array|boolean    d'autres tableau contenant les templates ou false pour que le cache ne soit pas chargé
34            */
35            function load( $key, $modTime = -1 )
36            {
37                $filename = $this->_getCachefileName( $key );
38                if( !file_exists( $filename ) || !is_readable( $filename ) )
39                    return false;
40       
41                $generatedOn = filemtime( $filename );
42                $ttl         = $this->getParam( 'lifetime' );
43                if( $ttl == 'auto' )
44                {
45                    if( $modTime <1 )
46                        return false;
47                    if( $modTime >$generatedOn )
48                        return false;
49                    return unserialize( file_get_contents( $filename ) );
50                }
51                elseif( is_int( $ttl ) )
52                {
53                    if( $generatedOn + $ttl <time() )
54                        return false;
55                    return unserialize( file_get_contents( $filename ) );
56                }
57               
58                return false;
59            }
60           
61           /**
62            * écrit le template pour le cache
63            *
64            * @access    public
65            * @param     string        clé du cache
66            * @param     array        le template à enregistrer
67            * @return    boolean        true si réussit
68            */
69            function write( $key, $templates )
70            {
71                $fp = @fopen( $this->_getCachefileName( $key ), 'w' );
72                if( !$fp )
73                    return false;
74                flock( $fp, LOCK_EX );
75                fputs( $fp, serialize( $templates ) );
76                flock( $fp, LOCK_UN );
77                return true;
78            }
79           
80           /**
81            * retourne le nom de fichier du cache
82            *
83            * @access   private
84            * @param    string        clé du cache
85            * @return   string        le nom du fichier cache
86            */
87            function _getCachefileName( $key )
88            {
89                return $this->getParam( 'cacheFolder' ) . '/' . $key . '.cache';
90            }
91        }
92        ?>

Comme vous pouvez voir, l’implémentation du cache template est vraiment simple et ne doit pas poser de problème pour un développeur PHP éxpérimenté.

Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki