
A partir du moment où on veut optimiser la vitesse d’affichage de pages, réduire les ressources utilisées, limiter les accès base de données, il faut se tourner vers les techniques de cache.
En version simplifiée, le cache est une version mémorisée du résultat d’une action qu’on utilise plutôt que de refaire cette action à chaque fois. On économise ainsi les ressources et le temps de l’action.
Par exemple, sur un digg-like, le code HTML de la page des dernières news peut être mémorisé dans un fichier. Ce fichier n’est recréé que quand une nouvelle news est ajoutée. Entre temps, les utilisateurs reçoivent donc instantanément le code HTML sans avoir à passer par la base de donnée.
Comme dans cet exemple, on peut stocker le code HTML afin de le renvoyer directement, mais on peut aussi cacher des données, par exemple le résultat de requêtes SQL.
Cache HTML
Ne vous inquiétez pas, il ne va pas falloir réécrire tout votre site pour remplacer les echo par l’écriture d’une chaîne de Caractères. Depuis PHP 4, une série de fonctions permet d’intercepter les echo dans un buffer, les fonction ob_xxx(). Petit exemple :
Affiche : Avant le buffer Dans le buffer Après le buffer Le buffer contient : Dans le buffer ob_start commande le début de l’interception des echo. ob_get_contents récupère le contenu du buffer créé ob_end_flush arrête l’interception des echo et affiche le contenu du buffer D’autres fonctions permettent de gérer plus finement la façon dont un intercepte les echo et quand on affiche, vide ou lit le buffer. Avec l’ensembles de ces fonctions, on peut facilement intercepté le code qui nous intéresse pour ensuite le stocker dans un fichier. Voilà deux fonctions qui permettront par exemple de ne régénérer une zone de code qu’au bout d’un temps donné :
-
function debutCache($fichier, $secondes){
-
-
// Si le cache n’existe pas ou si le temps est dépassé.
-
-
// On démarre l’interception
-
-
return true;
-
-
}else{ // Si le cache est toujours valide
-
-
// On affiche le contenu du cache
-
-
return false;
-
}
-
}
-
-
function finCache($fichier){
-
-
// On récupère le résultat de l’interception
-
-
// On arrête l’interception et on affiche le code
-
-
if($buffer){ // Si on a un buffer
-
-
// On l’enregistre
-
}
-
}
-
// On cache le contenu du code à suivre et on le met à jour que si le cache est plus vieux que 60 secondes.
-
if(debutCache(‘cache.html’, 10)){
-
…
-
… // Votre code PHP
-
…
-
-
finCache(‘cache.html’);
-
}
Cache de données
A nouveau, pas besoin de tout réécrire. Ce coup-ci ce sont les fonctions serialize() et unserialize() qui vont être mises à contribution. Serialize sert à transformer n’importe quelle donnée en chaîne de caractère. Ca marche également pour les objets et les tableaux. Unserialize retransforme ces chaînes dans leur format d’origine. Petit exemple :
-
‘prénom’=>‘Jean’,
-
‘téléphone’=>array(123456, 7891011));// On transforme le tableau en chaîne de caractères
-
-
// On supprime complètement le tableau
-
-
// On récupère le tableau depuis la chaîne de caractères
-
Affiche : Array ( [nom] => Dupont [prénom] => Jean [téléphone] => Array ( [0] => 123456 [1] => 7891011 ) ) Et si on utilise la fonction eval, qui sert à exécuter une chaîne de caractère en PHP, on peut mettre en cache le résultat d’une fonction avec la fonction suivante :
-
function cacheDonnées($fichier, $function, $secondes){
-
-
// Si le cache n’existe pas ou si le temps est dépassé.
-
-
// On récupère le résultat de la fonction
-
-
// On transforme en chaîne de caractères
-
-
// On l’enregistre
-
-
return $données;
-
-
}else{ // Si le cache est toujours valide
-
-
// On récupère la chaîne de caractère mise en cache.
-
-
// On retransforme les données dans leur format d’origine.
-
-
return $données;
-
}
-
}
-
function test(){
-
‘nom’=>‘Dupont’,
-
‘prénom’=>‘Jean’,
-
‘téléphone’=>array(123456, 7891011));
-
}
-
-
$tableau = cacheDonnées(‘cache.html’, ‘test’, 10);
-
Petite parenthèse pour signaler que la commande eval est potentiellement extrêmement dangereuse. Si elle utilise des paramètres de l’URL, elle peut permet à une personne malveillante d’exécuter du code PHP sur votre serveur si vous n’avez pas pris les précautions nécessaires. Pensez donc bien à cette possibilité avant d’utiliser eval.





Hello,
petite remarque, serialize est pas super point de vue performance ….
a noté, que dans le cas où vous écrivez peux souvent le cache, une solution est peut-être de sauver sous forme d’un tableau dans un fichier .php directement …