Classe Cache - exemple d'utilisation
Table des matières
Voici un exemple illustrant les différents aspects de l'utilisation du cache.
Prenons l'exemple du module FAQ dont l'identifiant est faq.
Le FAQ utilise une base de données pour gérer les données et en particulier les catégories. Compte-tenu de leur nombre (même sur un très gros site il n'y en aura jamais des milliers), il est judicieux de mettre en cache les informations les concernant afin d'accélérer l'affichage en évidant des requêtes dans la base de données. De plus, quasiment comme dans tout module, les données de configuration sont aussi à mettre en cache. Pour cela le noyau intègre une table dans la base de données permettant de stocker les autorisations des modules.
On vérifiera au passage que la configuration du module indique l'utilisation du cache : dans module/lang/french/config.ini la ligne suivante doit figurer
Voici le contenu du fichier faq_cache.php (vous noterez l'importance du nom).
Plusieurs lignes sont propres à ce module et à son fonctionnement mais on portera une attention particulières au lignes suivantes :
Lorsque vous souhaitez charger le fichier cache de la FAQ il vous suffit de faire :
Les variables seront directement accessibles dans les variables déclarées dans le fichier de génération.
Par exemple pour avoir la configuration de la FAQ on utilisera la variable $FAQ_CONFIG qui, telle qu'elle a été déclarée, est un tableau. On pourra y accéder directement après le chargement grâce à sa déclaration "globale".
Pour rester dans cet exemple, lorsqu'on modifie la configuration de la FAQ, les nouvelles valeurs sont à mettre à jour dans la base de données. Mais le fichier cache n'est plus à jour. A ce moment à il faut appeler la fonction de régénération pour l'actualiser :
Prenons l'exemple du module FAQ dont l'identifiant est faq.
Informations en cache
Le FAQ utilise une base de données pour gérer les données et en particulier les catégories. Compte-tenu de leur nombre (même sur un très gros site il n'y en aura jamais des milliers), il est judicieux de mettre en cache les informations les concernant afin d'accélérer l'affichage en évidant des requêtes dans la base de données. De plus, quasiment comme dans tout module, les données de configuration sont aussi à mettre en cache. Pour cela le noyau intègre une table dans la base de données permettant de stocker les autorisations des modules.
On vérifiera au passage que la configuration du module indique l'utilisation du cache : dans module/lang/french/config.ini la ligne suivante doit figurer
Code TEXT :
cache=1
Fichier de génération
Voici le contenu du fichier faq_cache.php (vous noterez l'importance du nom).
Code PHP :
<?php /*################################################## * faq_cache.php * ------------------- * begin : November 11, 2007 * copyright : (C) 2007 Sautel Benoit * email : ben.popeye-at-phpboost.com * * ################################################### * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ###################################################*/ function generate_module_file_faq() { global $Sql; //Configuration $config = unserialize($Sql->Query("SELECT value FROM ".PREFIX."configs WHERE name = 'faq'", __LINE__, __FILE__)); $root_config = $config['root']; $root_config['auth'] = $config['global_auth']; $string = 'global $FAQ_CONFIG, $FAQ_CATS;' . "\n\n"; //List of categories and their own properties $string .= '$FAQ_CATS = array();' . "\n\n"; $result = $Sql->Query_while("SELECT id, id_parent, c_order, auth, name, visible, display_mode, image, num_questions, description FROM ".PREFIX."faq_cats ORDER BY id_parent, c_order", __LINE__, __FILE__); while ($row = $Sql->Sql_fetch_assoc($result)) { $string .= '$FAQ_CATS[' . $row['id'] . '] = ' . 'id_parent' => $row['id_parent'], 'order' => $row['c_order'], 'name' => $row['name'], 'desc' => $row['description'], 'visible' => (bool)$row['visible'], 'display_mode' => $row['display_mode'], 'image' => $row['image'], 'num_questions' => $row['num_questions'], 'description' => $row['description'], ), true) . ';' . "\n"; } return $string; } ?>
Plusieurs lignes sont propres à ce module et à son fonctionnement mais on portera une attention particulières au lignes suivantes :
- 28 : petite vérification permettant de s'assurer que l'environnement de PHPBoost a été chargé
- 30 : on déclare la fonction en respectant scrupuleusement les règles sur son nom.
- 32 : l'objet $Sql est utilisé dans la classe, on l'importe dans le contexte de la fonction
- 38 : on crée la chaîne qu'on va renvoyer. Elle commence par la déclaration en global de ou des variables contenues dans le fichier cache.
- 39 : on notera l'utilisation de la fonction PHP var_export (avec comme deuxième argument true) qui formate la déclaration d'une variable en langage PHP. Elle supporte aussi bien les tableaux que les chaînes, de ce fait vous n'avez pas à vous préoccuper des problèmes liés aux guillemets simples ou doubles.
- 66 : la chaîne $string contient au moment auquel on la renvoie ce qui sera écrit dans le fichier cache (à <?php et ?> près).
Chargement et génération du fichier
Chargement et utilisation des données
Lorsque vous souhaitez charger le fichier cache de la FAQ il vous suffit de faire :
Code PHP :
$Cache->Load_file('faq');
Les variables seront directement accessibles dans les variables déclarées dans le fichier de génération.
Par exemple pour avoir la configuration de la FAQ on utilisera la variable $FAQ_CONFIG qui, telle qu'elle a été déclarée, est un tableau. On pourra y accéder directement après le chargement grâce à sa déclaration "globale".
Régénération
Pour rester dans cet exemple, lorsqu'on modifie la configuration de la FAQ, les nouvelles valeurs sont à mettre à jour dans la base de données. Mais le fichier cache n'est plus à jour. A ce moment à il faut appeler la fonction de régénération pour l'actualiser :
Code PHP :
$Cache->Generate_module_file('faq');