Framework

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.

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 :
  1. <?php
  2. /*##################################################
  3.  * faq_cache.php
  4.  * -------------------
  5.  * begin : November 11, 2007
  6.  * copyright : (C) 2007 Sautel Benoit
  7.  * email : ben.popeye-at-phpboost.com
  8.  *
  9.  *
  10.  ###################################################
  11.  *
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2 of the License, or
  15.  * (at your option) any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; if not, write to the Free Software
  24.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  25.  *
  26. ###################################################*/
  27.  
  28. if( defined('PHP_BOOST') !== true) exit;
  29.  
  30. function generate_module_file_faq()
  31. {
  32. global $Sql;
  33. //Configuration
  34. $config = unserialize($Sql->Query("SELECT value FROM ".PREFIX."configs WHERE name = 'faq'", __LINE__, __FILE__));
  35. $root_config = $config['root'];
  36. $root_config['auth'] = $config['global_auth'];
  37. unset($config['root']);
  38. $string = 'global $FAQ_CONFIG, $FAQ_CATS;' . "\n\n";
  39. $string .= '$FAQ_CONFIG = ' . var_export($config, true) . ';' . "\n\n";
  40.  
  41. //List of categories and their own properties
  42. $string .= '$FAQ_CATS = array();' . "\n\n";
  43. $string .= '$FAQ_CATS[0] = ' . var_export($root_config, true) . ';' . "\n";
  44. $result = $Sql->Query_while("SELECT id, id_parent, c_order, auth, name, visible, display_mode, image, num_questions, description
  45. FROM ".PREFIX."faq_cats
  46. ORDER BY id_parent, c_order", __LINE__, __FILE__);
  47.  
  48. while ($row = $Sql->Sql_fetch_assoc($result))
  49. {
  50. $string .= '$FAQ_CATS[' . $row['id'] . '] = ' .
  51. 'id_parent' => $row['id_parent'],
  52. 'order' => $row['c_order'],
  53. 'name' => $row['name'],
  54. 'desc' => $row['description'],
  55. 'visible' => (bool)$row['visible'],
  56. 'display_mode' => $row['display_mode'],
  57. 'image' => $row['image'],
  58. 'num_questions' => $row['num_questions'],
  59. 'description' => $row['description'],
  60. 'auth' => unserialize($row['auth'])
  61. ),
  62. true)
  63. . ';' . "\n";
  64. }
  65. return $string;
  66. }
  67.  
  68. ?>


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');
Cette page a été vue 2239 fois