Retourner à la page d'accueil de TJS
 

Nous avons vu comment mesurer les performances d'un script et comment améliorer les performances des requêtes SQL. Continuons notre tour des méthodes pour encore améliorer les performances de votre site.

Le principe général d'une optimisation est d'améliorer le rendement d'un traitement. Certains traitements restent malgré toutes les optimisations imaginables assez longs. La solution d'optimisation est alors de stocker le résultat du traitement et de le retrouver en cas de besoin au lieu de refaire le traitement complet.
Cette stratégie a été adoptée par MySQL avec la gestion du cache. Il est également possible de faire la même chose avec des traitements PHP. Malheureusement, il n'existe pas de solution intégrée pour gérer le cache. Nous allons utiliser une des nombreuses solutions développées par la communauté PHP.

Le choix de Cache_Lite
J'ai choisi après pas mal de recherches et de tests la solution de Fabien Marty, Cache_Lite. Cette solution a l'immense avantage d'être orientée optimisation et facilité d'utilisation, tout en permettant une gestion fine du cache et des paramètres. Après plus d'un an d'utilisation sur mes sites, j'en suis toujours aussi satisfait : ca tourne tout seul !
Vous pouvez télécharger la dernière version de Cache_Lite sur cette page.
La documentation d'installation de Fabien est suffisamment claire et précise (et en français). Je ne vais pas ici la reprendre. Je préfère montrer l'intérêt d'une telle solution par quelques exemples d'utilisations.
Même si Cache_Lite est prévue pour fonctionner avec PEAR, il est très facile de l'intégrer dans un site qui n'utilise pas les modules PEAR, en modifiant simplement l'appel à la méthode raiseError() qui est déclenchée très 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 dernières participations des membres
Voici le script permettant de mettre en cache les dernières 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 crée un objet $Cache_Lite avec les paramètres contenu dans le table $Options_lite. En particulier, on note la durée de vie fixée à 3600 secondes et le répertoire permettant de stocker les fichiers de cache /temp/.
Ensuite, on essaye de récupérer le cache dernieres de la catégorie participations.
Si le fichier existe, on le renvoie avec print(), sinon, on effectue le traitement et on enregistre le résultat dans le cache avec la méthode 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 même manière, 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 catégorie participations.
Dans une même page, on peut créer autant de morceaux de pages à enregistrer en cache, avec simplement quelques lignes de code.

Manipuler le cache
Contrairement au cache SQL géré complètement par le moteur, vous devez vous assurer vous-même de la validité des données 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 catégories cohérentes.
Pour supprimer tous les fichiers de cache de la catégorie de participations :   include "Lite.php";
  $Options_lite=Array("cacheDir"=>"/temp/");
  $Cache_Lite=new Cache_Lite($Options_lite);
  $Cache_Lite->clean("participations");

Il faut créer un objet $Options_lite avec en paramètre le répertoire des fichiers de cache. Ensuite, appelez la méthode clean() avec en paramètre le nom de la catégorie.
L'appel de clean() sans paramètre efface tous les fichiers de cache du répertoire.

Pour effacer un fichier particulier, utilisez la méthode 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 récupération du cache prend à peine quelques millisecondes et permet d'économiser des traitements redondants.
Naturellement l'utilisation du cache est d'autant plus intéressante 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 synthèses statistiques.

Dernière partie : Optimisation serveur

Chercher une fonction, un objet, ...

Le 22/11/2017 17:42:47 sur php7 en 10.8 ms