Petite précision en préambule : compilation et cache sont différents : la compilation transforme un template (.tpl) en code PHP tandis que le mécanisme de cache stocke le résultat final. En production le cache Smarty doit être activé et l’option “Ne jamais recompiler les fichiers de templates” doit être sélectionnée (Paramètres Avancés -> Performance).
1) Fonctionnement du cache Smarty
Premièrement, vous devez savoir que cette fonction ne fonctionne que si le cache est activé ! Cela parait évident, mais il vaut mieux le préciser.
Afin d’activer le cache dans Smarty, cette fonction attend un des paramètres suivant :
Smarty ::CACHING_LIFETIME_CURRENT (ou 1)
(Permet d’assigner une durée de vie commune à tous les fichiers en cache)
Smarty ::CACHING_LIFETIME_SAVED (ou 2)
(Permet d’assigner une durée de vie privée au fichier mis en cache)
Mettre le cache à 0 désactivera celui-ci
$smarty->setCaching(Smarty:CACHING_LIFTIME_CURRENT);
Une fois le cache activé, la fonction « display » (chargée d’afficher un fichier TPL) va effectuer une copie de celui-ci et le placer en cache.
Par la suite, si vous faites de nouveau appel à cette fonction, Prestashop ne générera pas un nouveau fichier TPL mais ira plutôt afficher celui en cache !
Comme vous pouvez vous en douter par le nom des variables ci-dessus, les fichiers en cache ont une durée de vie et, bien évidemment, vous pouvez régler cette durée de vie vous-même en modifiant la propriété « cache_lifetime » de Smarty. Cette valeur représente une durée de vie en secondes, l’initialiser à -1 forcera le cache à ne jamais expirer.
$smarty->setCaching(Smarty:CACHING_LIFTIME_SAVED); $smarty->cache_lifetime = 3600;
Pour information, les fichiers cache dans Prestashop sont situés dans
cache/smarty/cache/nom_du_module/fichier_cache.tpl.php (si version >=1.5.4.1)
ou
cache/smarty/cache/fichier_cache.tpl.php (si version < 1.5.4.1)
2) Exemple d’utilisation du cache avec le module Editorial
Le fonctionnement de ce module est assez simple :
- création de 2 tables dans la bdd à l’installation du module
- affichage d’un formulaire avec différents champs qui sont enregistrés dans les tables du module
- affichage du template sur le hook home
Comment fonctionne le cache dans ce module ?
A l’affichage de la page d’accueil, le hook displayHome est éxécuté.
Côté module Editorial, au niveau de ce hook, voici les étapes :
La fonction isCached() vérifie que le template est déjà en cache . Elle prend en paramètre le nom du template et l’id du fichier cache généré à son tour par la fonction getCacheId().
if (!$this->isCached('editorial.tpl', $this->getCacheId()))
Si aucun paramètre n’est passé dans la fonction $this->getCacheId() (fonction disponible qu’à partir de la version 1.5.4.1), l’id du fichier cache est composé des éléments suivants :
- le nom du fichier
- l’id de la boutique (permet donc d’avoir 2 fichiers cache si 2 boutiques)
- l’id du groupe du client si il est connecté
- l’id de la langue en front
Cet id cache sera intégré dans le nom du fichier cache.
Pour résumer, si vous avez 2 boutiques avec 5 groupes client et 3 langues, 30 fichiers cache peuvent être générés (2 x 5 x 3 ).
a) Le fichier cache n’existe pas
Dans notre module éditeur de la page d’accueil, si le template n’a pas été mis en cache, alors les opérations suivantes sont éxécutées :
un nouvel objet EditorialClass est créé (ce qui implique des appels à la base de données)
des variables sont passées dans le template ($this->smarty->assign…)
Enfin le fichier cache est créé avec la fonction display grâce au 3e paramètre non null (id cache) de cette fonction.
b) Le fichier cache existe
Dans ce cas, les opérations décrites plus haut ne sont pas traitées (nouvel objet EditorialClass etc..) et Prestashop ne générera pas un nouveau fichier TPL mais ira afficher directement celui en cache.
Enfin, à chaque modification de la configuration de notre module, la fonction postProcess() met à jour les informations dans la bdd et les fichiers en cache sont supprimés avec la fonction _clearCache() qui prend en paramètre le nom du template.
3) Comparaison avec ou sans cache
Prenons un module assez simple , il charge 2 données dans la table de configuration et dans une table créée pour notre module. Il modifie également une de ces données. Nous avons ainsi 2 chargements de données déjà en mémoire et 3 requêtes en base de données. Peu de traitement donc mais vous allez remarquer que la différence est tout de même importante avec la mise en cache.
Nous mesurons le temps d’exécution grâce à l’outil de profiling de Prestashop. (si vous souhaitez activer l’outils de profiling dans votre Prestashop, modifiez le fichier « config/defines .inc.php » et modifier la valeur de profiling à la ligne 44)
define(‘_PS_DEBUG_PROFILING_’,true);
Résultats obtenus avant la mise en cache : notre module est affiché dans la colonne de gauche, on s’intéresse donc au chargement du displayLeftColumn. Sur 100 chargements, on obtient une moyenne de 120 ms.
Résultats obtenus après la mise en cache : sur 100 chargements, on obtient une moyenne de 52 ms. On remarque également que le nombre de requêtes SQL a diminué de 3 : la mise en cache a bien ignoré nos traitements pour utiliser les données déjà stockées.
Conclusion : On peut constater une réduction du temps de chargement des pages avec seulement 3 à 4 lignes en plus dans le code de votre module !
Un grand merci à Thibault, Stephan et Emmanuel pour leur contribution !!