Connectix Boards

Bienvenue, vous n'êtes pas connecté. ( Se connecter - S'enregistrer )

Dernière version sortie: 0.8.4!
Venez tester la version 1.0 beta :)

Connectix Boards > Vous et votre forum Connectix Boards > Support > [Doc] Utiliser le cache de CB

RSS >  [Doc] Utiliser le cache de CB, pour économiser des requêtes dans vos MODs
Ishimaru Chiaki #1 18/07/2010 - 21h41

Groupe : Doc-rédacteur
Messages : 800
Enregistré le : 12/03/2008

Hors ligne Site Web

Lorsque l'on crée un CMS ou un site perso en PHP, on doit s'assurer que le script soit optimisé autant du côté client que du côté serveur.

Dans le cas de CB, l'un des moyens d'optimisation côté serveur qui est utilisé est l'utilisation d'un système de cache, qui s'avère très utile pour économiser des requêtes SQL là où les infos changent peu fréquemment, puisque cela peut faire toute la différence sur un site à fort trafic comme Directwind.

Ce système de cache est utilisé notamment pour la liste des groupes dans la légende, la configuration générale du forum, les smileys, les modérateurs et la structure.  Toutes ces infos changent si peu souvent que l'utilisation du cache est très avantageuse dans ce cas.

Il est donc très utile de pouvoir utiliser le système de cache si on veut coder un MOD qui est très exigeant en requêtes SQL comme une page de statistiques par exemple.

Je vais donc vous montrer les bases de l'utilisation.

Fonctionnement du cache

L'utilisation du cache repose sur les fonctions serialize() et unserialize().  La première permet de conserver une variable de type array (tableau) sous forme d'une chaîne linéaire de celle-ci, tandis que la deuxième permet de récupérer cette variable dans sa forme d'origine.

Pour plus de détails sur ces deux fonctions, je vous invite à lire ce tutoriel dédié à ces deux fonctions

Initialiser notre fichier de cache

Avant de travailler sur la mise en cache, il est essentiel de l'initialiser d'abord, pour indiquer quel fichier créer ou modifier.

Ouvrez donc le fichier include/lib/lib.cb.php et trouvez ces lignes :
define('CB_CACHE_CONFIG',    CB_PATH . 'data/config.cache.php');        // Fichier de cache pour la config
define('CB_CACHE_SMILEYS',    CB_PATH . 'data/smileys.cache.php');    // Fichier de cache pour les smileys
define('CB_CACHE_MODS',        CB_PATH . 'data/mods.cache.php');        // Fichier de cache pour les modérateurs
define('CB_CACHE_STRUCT',    CB_PATH . 'data/structure.cache.php');    // Fichier de cache pour la structure
define('CB_CACHE_CLASSES',    CB_PATH . 'data/classes.cache.php');    // Fichier de cache pour les groupes d'utilisateurs


Juste après, ajoutez la ligne de votre nouveau fichier de cache :
define('CB_CACHE_MONFICHIER',    CB_PATH . 'data/monfichier.cache.php');        // Fichier de cache personnalisé

en remplaçant "monfichier" aux deux endroits, pour le nom qui correspond aux données que vous voulez mettre en cache.

Préparer des données pour la mise en cache

Comme vous l'aurez compris plus haut, il faudra que les données à entrer soient sous forme d'array.

Pour cela, je vais vous expliquer comment faire selon deux cas de figure possibles que vous pourriez rencontrer : l'array simple et l'array double.

Un array simple

Admettons que vous vouliez faire un petit bloc de statistiques (nombre de sujets, messages, inscrits, messages par jour, sujets par jour, inscrits par jour, date d'ouverture, dernier utilisateur, ...) et que chacune des données est donc "séparée".

Voici un exemple :
$nb_messages = 5000;
$nb_sujets = 700;
$nb_inscrits = 2000;


Il vous suffit de les regrouper en un array, en assignant une clé à chacune des trois variables de l'exemple :
$monarray = array('messages' => $nb_messages, 'sujets' => $nb_sujets, 'inscrits' => $nb_inscrits);

Vous aurez ensuite besoin de donner un nom à la variable globale qui servira pour le traitement de ces données une fois extraites.

Prenons par exemple :
$GLOBALS['cb_monarray']

Il ne reste plus qu'à écrire ces données dans le fichier de cache, comme ceci :
file_put_contents(CB_CACHE_MONFICHIER,'<?php '."\n".
                           '$GLOBALS[\'cb_monarray\'] = unserialize(\''.str_replace("'","\\'",serialize($monarray)).'\');'."\n".
                       '?>');


Un array double

Admettons que vous voulez extraire de la base de données le nombre de réponses de chaque sujet pour en faire un classement.  Il vous faudra donc extraire le titre de chacun des sujets, le nombre de réponses et l'id de chacun des sujets.  Vous vous retrouvez donc déjà avec trois arrays à gérer :

$data['topic_name']
$data['topic_id']
$data['topic_nbreply']

 Ceci doit se faire à l'intérieur de la boucle même du traitement des données extraites :

$num=1;
while ($data = $GLOBALS['cb_db']->fetch_assoc($requete))
{
   $topic_name[$num] = $data['topic_name'];
   $topic_id[$num] = $data['topic_id'];
   $topic_nbreply[$num] = $data['topic_nbreply'];
   $num++;
}


Dans cet exemple, j'utilise une variable $num que j'initialise à 1, ceci s'avère très pratique pour un classement des sujets actifs par exemple, puisque dans ce cas, on peut se baser sur la clé de chaque entrée de l'array qui commence donc à 1 au lieu de 0.

En tout, vous aurez donc trois arrays à écrire.  Vous devez donc choisir un nom de variable globale pour chacun d'eux.

Pour notre exemple :
$GLOBALS['cb_topicname']
$GLOBALS['cb_topicid']
$GLOBALS['cb_topicreplies']


Il ne vous reste plus qu'à l'écrire dans le fichier !
file_put_contents(CB_CACHE_MONFICHIER,'<?php '."\n".
                           '$GLOBALS[\'cb_topicname\'] = unserialize(\''.str_replace("'","\\'",serialize($topic_name)).'\');'."\n".
                           '$GLOBALS[\'cb_topicid\'] = unserialize(\''.str_replace("'","\\'",serialize($topic_id)).'\');'."\n".
                           '$GLOBALS[\'cb_topicreplies\'] = unserialize(\''.str_replace("'","\\'",serialize($topic_nbreply)).'\');'."\n".
                       '?>');



Astuce bonus : Régler l'intervalle de rafraîchissement

Dans certains cas de figure, comme une page de statistiques, régler le délai du rafraîchissement du cache est tout indiqué pour que les requêtes lourdes ne soient faites qu'à une intervalle déterminée.

Pour cela, vous devez d'abord initialiser le délai d'expiration.

Par exemple, si vous voulez le mettre à 6 heures (donc 4 fois par jour) :
$time_expire = time() - (3600*6);

Ensuite, vous devrez vérifier si le fichier existe, et si c'est le cas, vérifier s'il n'est pas expiré :
if(file_exists($cache) && filemtime($cache) > $expire)
{
   require_once(CB_CACHE_MONFICHIER);
}
else
{
   //Le cache est expiré, on exécute donc les instructions pour réécrire le fichier avec les données à jour.
}



Ce tutoriel ne faisait que vous montrer les bases de l'utilisation du cache de CB en utilisant des exemples d'application de la préparation des variables et de la mise en cache.  Il ne vous reste qu'à l'adapter au contexte de votre MOD sur lequel vous voulez l'utiliser.


Document rédigé par Ishimaru Chiaki.
Ce message a été édité par Martin le 27/07/2010 à 09h50.
Besoin de volontaires pour les tests du support IPv6 dans la future version 0.8.5 !
Plus d'informations ici

Mon fil Twitter
Martin #2 19/07/2010 - 22h35

Groupe : Administrateur
Messages : 3657
Enregistré le : 01/02/2005

Hors ligne Site Web

T'es géniale, merci!
J'ajouterais un exemple avec un array sérialisé, vu que dans l'exemple de la fin, tu ne mets que tes variables simples.

Encore merci!
Posted Image
« Entre une mauvaise cuisinière et une empoisonneuse il n'y a qu'une différence d'intention. » - P. Desproges
Ishimaru Chiaki #3 19/07/2010 - 23h07

Groupe : Doc-rédacteur
Messages : 800
Enregistré le : 12/03/2008

Hors ligne Site Web

Martin @ 19/07/2010 - 16h35 a dit:

T'es géniale, merci!
J'ajouterais un exemple avec un array sérialisé, vu que dans l'exemple de la fin, tu ne mets que tes variables simples.

Encore merci!



N'hésite pas à le compléter :)
Besoin de volontaires pour les tests du support IPv6 dans la future version 0.8.5 !
Plus d'informations ici

Mon fil Twitter
finalbob #4 26/07/2010 - 13h04

Groupe : Modérateur
Messages : 718
Enregistré le : 08/03/2007

Hors ligne Site Web

Clair et concis, félicitation !
youplaboum !
Posted Image
tout mes MODs pour cb
Martin #5 27/07/2010 - 09h52

Groupe : Administrateur
Messages : 3657
Enregistré le : 01/02/2005

Hors ligne Site Web

Et hop: clique ici si tu peux!

Encore merci!!!
Posted Image
« Entre une mauvaise cuisinière et une empoisonneuse il n'y a qu'une différence d'intention. » - P. Desproges

 >  Réponse rapide

Composez votre message

Connectix Boards > Vous et votre forum Connectix Boards > Support > [Doc] Utiliser le cache de CB

 >  Informations du forum

1 personne(s) présente(s) durant une période de 15 minutes (0 membre(s) et 1 invité(s)).