Vous êtes ici : Dossiers référencement > Webmastering

Membre WebRankInfo ?

S'inscrire Aide

Tutoriel : comment mettre en cache des pages PHP/MySQL

Par fandecine (son site : www.fan-de-cinema.com/), Lundi 9 août 2010

Ces publicités sont réduites voire supprimées pour les membres WebRankInfo.

Les scripts serveur (PHP ou tout autre langage) peuvent être coûteux en performances pour votre serveur, par exemple s'ils font des requêtes lourdes ou fréquentes à votre base de données. Il est donc intéressant d'appliquer des solutions de mise en cache qui accélèrent considérablement la vitesse de chargement (prise en compte par Google désormais). Voici un script / tutoriel pour mettre en cache ses pages PHP, réalisé par Fandeciné, éminent membre-modérateur du forum WebRankInfo.

Sommaire

  1. Les nouveautés du script
  2. Structure des données et conventions
  3. Le répertoire de stockage du cache
  4. Les classes PHP
  5. Utilisation du script
  6. Votre avis

Nouvelle version du script

L'ancien script avait quelques inconvénients (en vrac) :

  • difficulté à intégrer des données dynamiques (données de session par exemple)
  • consommation importante et inutile d'espace disque (les données étaient mise en cache avec le code HTML)
  • toute modification de l'habillage du site (charte, CSS, structure ...) imposait de vider le cache en totalité

J'ai donc réfléchi à l'époque a un système qui ne cacherait que les données. J'ai tout d'abord réalisé la mise en cache à l'aide de fichiers XML (cela élimine certaines restrictions mais reste gourmand en espace disque et demande un traitement plus lourd qui consomme des ressources processeur)

Le système a fonctionné sans problème sur Fan de Cinéma pendant 1 an. Mais je suis un puriste et j'ai cherché la solution ultime (pour qu'un script me satisfasse il faut qu'il marche mais aussi qu'il soit beau !).

J'ai fini par trouver la solution en utilisant la sérialisation des données en PHP. Le résultat est un système de cache léger, performant et totalement indépendant de la mise en forme des données coté HTML/PHP.

Structure des données et conventions du script

Pas d'impatience, voyons d'abord les conventions utilisées :

  1. On suppose que votre serveur web (Apache, Lighttpd, Nginx ou autre) et PHP fonctionne sous le compte www:www (utilisateur www du groupe www)
  2. on suppose que la racine de l'arborescence de votre serveur web est /home/www/
  3. pour illustrer l'exemple, on suppose que nous avons une vidéothèque à gérer dont la BDD est la suivante:
    table dvd : iddvd, titre, date, durée, format, synopsis
    table personnalites : idperson, nom, prenom
    table casting : iddvd, idperson

1ère étape : création des répertoires de stockage du cache

On crée un dossier nommé cache hors de la racine du serveur web (par exemple /home/cache/) sous le compte www:www (php peut y acceder en lecture et ecriture mais pas votre serveur web par mesure de sécurité). on peut structurer l'arborescence de ce dossier comme on le souhaite et selon ses besoins. Par la même occasion créons le dossier /home/classes/ pour stocker nos fichiers classes PHP.

2ème étape : création des classes PHP

On crée des classes PHP qui auront en charge la lecture des données en BDD, la mise en cache et l'envoi des données aux scripts PHP. Dans mon exemple, une classe permet d'obtenir les données relatives à un DVD, l'autre d'obtenir la liste des DVD où figure une personnalité donnée (on fait simple). Toujours dans cet exemple, les données relatives aux DVD seront cachées dans /home/cache/dvd/ et les données relatives aux personnalité seront cachées dans /home/cache/person/.

Voici donc les classes que l'on met dans un fichier /home/classes/ma_classe.php :

La classe DVD :

<?php
class DVD {
// c'est le tableau qui contiendra les données de la classe
var $vars = array();

fonction DVD($titre) {
if(file_exists("/home/cache/dvd/".clean($titre).".txt")===false) {
// on verifie si le fichier de données est en cache
// la fonction clean permet de nettoyer les caractères spéciaux,
// son code est donné plus bas

// le fichier n'est pas en cache
// on fait ici le traitement pour lire la BDD et on stocke le résultat
// dans un tableau de la forme :
// Array {
//   [Erreur] => true si le DVD n'existe pas, false sinon
//   [Iddvd] => xxxx
//   [Titre] => blablabla
//   [Date] => blablabla
//   [Annee] => xxxx
//   [Format] => blablabla
//   [Casting] => Array {
//      [0] => Array {
//         [Nom] => blablabla
//         [Prenom] => blablabla
//      }
//      [1] => Array {
//         [Nom] => blablabla
//         [Prenom] => blablabla
//      }
//      [2] => Array {
//         [Nom] => blablabla
//         [Prenom] => blablabla
//      }
//   }
//   on stoque ce tableau dans $this->vars
// il n'y a plus qu'à sérialiser le tableau et le stocker dans le cache
$temp=serialize($this->vars);
$fd = fopen("/home/cache/dvd/".clean($titre).".txt","w");
if ($fd) {
fputs($fd,$temp);
fclose($fd);
}
} else {  //  le fichier est en cache
// on lit le fichier cache pour en extraire le contenu
$temp=implode("",@file("/home/cache/dvd/".clean($titre).".txt"));
// on désérialise le contenu et on le stocke dans le tableau $vars
$this->vars=unserialise($temp);
}
}
// on implémente une méthode pour lire les données de la classe
function getAllVars() {
return $this->vars;
}
// on implémente une méthode pour lire un élément du tablau
function getVars($name) {
return $this->vars[$name];
}
}
?>

La classe Person :

<?php
class Person {
// c'est le tableau qui contiendra les données de la classe
var $vars = array();

fonction DVD($nom,$prenom) {
if(file_exists("/home/cache/person/".clean($nom).",".clean($prenom).".txt")===false) {
// on verifie si le fichier de données est en cache;
// la fonction clean permet de nettoyer les caractères spéciaux,
// son code est donné plus bas

// le fichier n'est pas en cache
// on fait ici le traitement pour lire la BDD et on stocke le résultat
// dans un tableau de la forme :
// Array {
//   [Erreur] => true si la personne n'existe pas, false sinon
//   [Nom] => blablabla
//   [Prenom] => blablabla
//   [Dvds] => Array
//      [0] => Array {
//         [Titre] => blablabla
//         [Date] => blablabla
//         [Annee] => xxxx
//         [Format] => blablabla
//      }
//      [1] => Array {
//         [Titre] => blablabla
//         [Date] => blablabla
//         [Annee] => xxxx
//         [Format] => blablabla
//      }
//      [2] => Array {
//         [Titre] => blablabla
//         [Date] => blablabla
//         [Annee] => xxxx
//         [Format] => blablabla
//      }
//   }
//   on stocke ce tableau dans $this->vars
//
// il n'y a plus qu'à sérialiser le tableau et le stocker dans le cache
$temp=serialize($this->vars);
$fd = fopen("/home/cache/person/".clean($nom).",".clean($prenom).".txt","w");
if ($fd) {
fputs($fd,$temp);
fclose($fd);
}
} else {  //  le fichier est en cache
// on lit le fichier cache pour en extraire le contenu
$temp=implode("",@file("/home/cache/person/".clean($nom).",".clean($prenom).".txt"));
// on désérialise le contenue et on le stocke dans le tableau $vars
$this->vars=unserialise($temp);
}
}
// on implémente une méthode pour lire les données de la classe
function getAllVars() {
return $this->vars;
}
// on implémente une méthode pour lire un élément du tablau
function getVars($name) {
return $this->vars[$name];
}
}
?>

Noms de fichier

Voici le petit code de la fonction clean qui permet de fabriquer des noms de fichiers conformes aux règles Unix :

 function clean($src){
$accents = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
$pasaccents = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
$dest=(strtr($src,$accents,$pasaccents));
$dest=strtolower($dest);
$dest=ereg_replace("[^/[:alnum:]]"," ",$dest);
$dest=str_replace("  "," ",$dest);
$dest=str_replace("  "," ",$dest);
return (str_replace(" ","-",$dest));
}

Utilisation du script

Voyons comment utiliser ces classes :

<?php
// on commence par intégrer notre fichier classe à notre script
include("/home/classes-v5/actualites-v5.class.php");
// on initialise la classe avec un titre de DVD
$my_dvd = new DVD("nom du dvd");
// on peut maintenant obtenir les données relatives au DVD
$my_dvd_datas=$my_dvd->getAllVars();
// le tableau $my_dvd_datas contient l'ensemble des données relatives au DVD
// on peut vérifier si le DVD existe
if($my_dvd->getVars("Erreur") {
// le DVD n'existe pas
} else {
// le DVD existe
}
// on peut retrouver un élément particulier du DVD
$my_dvd_casting=$my_dvd->getVars("Casting");
// le tableau $my_dvd_casting contient le casting du DVD sous forme d'une liste nom,prénom
$my_dvd_format=$my_dvd->getVars("Format");
// la variable $my_dvd_format contient le format du DVD
// on peut bien sûr faire de même avec la classe Person
// on initialise la classe avec nom prénom de personnalité
$my_person = new Person("nom de la personne","prenom de la personne");
// on peut maintenant obtenir les données relatives à la personnalité
$my_person_datas=$my_person->getAllVars();
// le tableau $my_person_datas contient l'ensemble des données relatives à la personnalité
// etc, etc ...
?>

Votre avis ?

Cet exemple est très simple, son seul objectif étant de montrer le principe du système basé sur la sérialisation des données en PHP, je fais confiance à votre imagination !

On discute dans le forum : script v2 de mise en cache PHP / MySQL

Vous avez aimé cet article ? Partagez-le !

Vous aimez WebRankInfo ? Suivez-nous !

Si vous souhaitez publier un extrait de cet article sur votre site, assurez-vous de respecter les conditions générales d'utilisation de WebRankInfo.

3 commentaires

  1. Julien dit :

    Je commence tout juste à me pencher sur la question de la mise en cache de données récurrentes sur mon CMS (menu, footer...). Ce système me semble simple et efficace. Je vais étudier ça plus en profondeur et tenter de l'adapter à mon besoin. Merci pour cet article.

  2. srouge dit :

    Bonjour,
    attention, il y a une erreur dans le code des classes : il faut mettre $this->vars=unserialize($temp) et non pas $this->vars=unserialise($tmp)!
    Un grand merci pour ce script en tout cas.

  3. Olivier Duffez dit :

    Merci srouge, j'ai corrigé

Postez un commentaire !

Les champs marqués du signe * sont obligatoires. L'adresse email ne sera pas affichée.

En postant un commentaire, vous acceptez les CGU du site WebRankInfo.

Formation référencement et webmarketing

Venez chez Ranking Metrics vous former au référencement, à Google Analytics et aux réseaux sociaux ! Plus de 4000 entreprises sont déjà venues (financement possible par OPCA, DIF...).

Préparés et animés par Olivier Duffez (WebRankInfo) et Fabien Faceries (AgentWebRanking), 2 professionnels reconnus dans le domaine, nos modules sur le référencement naturel sont très complets tout en laissant une grande place à l'interactivité pour répondre à toutes les questions des participants.

Pour connaître le plan détaillé de chaque module, le prix, les dates et les lieux, consultez le site de Ranking Metrics (organisme de formation agréé).

WebRankInfo sur Twitter

Suivez-moi sur Twitter !
WebRankInfo Twitter

Hébergement web

Hebergement web mutualise, dedie

Pour un bon référencement, il faut un bon hébergeur. Testez Sivit, l'hébergeur choisi par Olivier Duffez pour son site WebRankInfo. Vous bénéficiez d'une garantie 30 jours satisfait ou remboursé.

A partir de 1,90 EUR HT/mois.