Retourner � la page d'accueil de TJS
 

Nous avons vu comment mesurer les performances d'un script et comment amliorer les performances des requtes SQL. Continuons notre tour des mthodes pour encore amliorer les performances de votre site.

Le principe gnral d'une optimisation est d'amliorer le rendement d'un traitement. Certains traitements restent malgr toutes les optimisations imaginables assez longs. La solution d'optimisation est alors de stocker le rsultat du traitement et de le retrouver en cas de besoin au lieu de refaire le traitement complet.
Cette stratgie a t adopte par MySQL avec la gestion du cache. Il est galement possible de faire la mme chose avec des traitements PHP. Malheureusement, il n'existe pas de solution intgre pour grer le cache. Nous allons utiliser une des nombreuses solutions dveloppes par la communaut PHP.

Le choix de Cache_Lite
J'ai choisi aprs pas mal de recherches et de tests la solution de Fabien Marty, Cache_Lite. Cette solution a l'immense avantage d'tre oriente optimisation et facilit d'utilisation, tout en permettant une gestion fine du cache et des paramtres. Aprs plus d'un an d'utilisation sur mes sites, j'en suis toujours aussi satisfait : ca tourne tout seul !
Vous pouvez tlcharger la dernire version de Cache_Lite sur cette page.
La documentation d'installation de Fabien est suffisamment claire et prcise (et en franais). Je ne vais pas ici la reprendre. Je prfre montrer l'intrt d'une telle solution par quelques exemples d'utilisations.
Mme si Cache_Lite est prvue pour fonctionner avec PEAR, il est trs facile de l'intgrer dans un site qui n'utilise pas les modules PEAR, en modifiant simplement l'appel la mthode raiseError() qui est dclenche trs rarement en cas d'erreur dans le traitement.

Pour vous convaincre
Voici quelques exemples d'utilisation pour vous convaincre de la facilit d'utilisation !

Les dernires participations des membres
Voici le script permettant de mettre en cache les dernires participations des membres.
  include "Lite.php";
  $Options_lite=Array("lifeTime"=>3600,"caching"=>true,"cacheDir"=>"/temp/");
  $Cache_Lite=new Cache_Lite($Options_lite);
  if ($data = $Cache_Lite->get("dernieres","participations")) {
    print($data);
  } else { // Le cache n'existe pas
    $contenu="";
    $query="SELECT * FROM participation ORDER BY dt DESC LIMIT 5";
    $rst=mysql_query($query);
    while ($participation=mysql_fetch_object($rst)) {
      $contenu.=participation->titre."<br>";
    }
    $Cache_Lite->save($contenu);
    print($contenu);
  }

Dans ce code, on commence par inclure le fichier des fonctions de cache_lite.
On cre un objet $Cache_Lite avec les paramtres contenu dans le table $Options_lite. En particulier, on note la dure de vie fixe 3600 secondes et le rpertoire permettant de stocker les fichiers de cache /temp/.
Ensuite, on essaye de rcuprer le cache dernieres de la catgorie participations.
Si le fichier existe, on le renvoie avec print(), sinon, on effectue le traitement et on enregistre le rsultat dans le cache avec la mthode save().
Ainsi, au prochain appel (s'il a lieu avant 3600 secondes), le cache sera retrouv et retourn sans refaire le traitement.

Toutes les participations des membres
De la mme manire, on peut enregistrer dans le cache toutes les participations des membres.
  include "Lite.php";
  $Options_lite=Array("lifeTime"=>3600,"caching"=>true,"cacheDir"=>"/temp/");
  $Cache_Lite=new Cache_Lite($Options_lite);
  if ($data = $Cache_Lite->get("toutes","participations")) {
    print($data);
  } else { // Le cache n'existe pas
    $contenu="";
    $query="SELECT * FROM participation ORDER BY dt DESC";
    $rst=mysql_query($query);
    while ($participation=mysql_fetch_object($rst)) {
      $contenu.=participation->titre."<br>";
    }
    $Cache_Lite->save($contenu);
    print($contenu);
  }


L'identifiant du cache est maintenant toutes toujours dans la catgorie participations.
Dans une mme page, on peut crer autant de morceaux de pages enregistrer en cache, avec simplement quelques lignes de code.

Manipuler le cache
Contrairement au cache SQL gr compltement par le moteur, vous devez vous assurer vous-mme de la validit des donnes contenu dans les fichiers du cache.
Par exemple, en cas d'ajout d'une participation par un membre, il faut penser supprimer tous les caches utilisant les participations. C'est relativement facile si vous avez bien nomm vos fichiers en utilisant des catgories cohrentes.
Pour supprimer tous les fichiers de cache de la catgorie de participations :   include "Lite.php";
  $Options_lite=Array("cacheDir"=>"/temp/");
  $Cache_Lite=new Cache_Lite($Options_lite);
  $Cache_Lite->clean("participations");

Il faut crer un objet $Options_lite avec en paramtre le rpertoire des fichiers de cache. Ensuite, appelez la mthode clean() avec en paramtre le nom de la catgorie.
L'appel de clean() sans paramtre efface tous les fichiers de cache du rpertoire.

Pour effacer un fichier particulier, utilisez la mthode remove()
  include "Lite.php";
  $Options_lite=Array("cacheDir"=>"/temp/");
  $Cache_Lite=new Cache_Lite($Options_lite);
  $Cache_Lite->remove("toutes", "participations");


Le cache par fichiers est redoutable d'efficacit : la rcupration du cache prend peine quelques millisecondes et permet d'conomiser des traitements redondants.
Naturellement l'utilisation du cache est d'autant plus intressante que le temps de traitement est long. Mais c'est souvent le cas. Je pense par exemple l'affichage de menus, de compteurs, de liste de contributions (derniers topics d'un forums, dernieres actus, derniers commentaires...) ou encore de pages lourdes comme des synthses statistiques.

Dernire partie : Optimisation serveur

Troisième édition Tout JavaScript chez Dunod

Tout JavaScript le livre chez DunodEn savoir plus
Sortie le 4 janvier 2023

Version papier 29€90
Format électronique 22€99.

Commandez en ligne

Chercher une fonction, un objet, ...

Le 30/09/2023 17:55:13 sur php7 en 15.67 ms