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
- Les nouveautés du script
- Structure des données et conventions
- Le répertoire de stockage du cache
- Les classes PHP
- Utilisation du script
- 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 :
- On suppose que votre serveur web (Apache, Lighttpd, Nginx ou autre) et PHP fonctionne sous le compte
www:www(utilisateurwwwdu groupewww) - on suppose que la racine de l'arborescence de votre serveur web est
/home/www/ - 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
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
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éé).
Hébergement web
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.
Catégories des dossiers
- Actualité
- Android
- Autres produits Google
- Brèves
- Conseils référencement
- Débuter en référencement
- Droit et Internet
- e-marketing
- Ecrire pour le web et le référencement
- Gmail
- Google AdSense
- Google AdWords
- Google Analytics
- Google Chrome
- Google Images
- Google Labs
- Google Maps
- Google Mobile
- Google News
- Google Search
- Google Toolbar
- Google Webmaster Tools
- Google+
- Indexation Google
- L'entreprise Google
- Les API de Google
- Livres sur le référencement et les moteurs de recherche
- Outils
- PageRank
- R&D référencement
- Ranking Metrics
- Référencement Bing
- Référencement des images
- Référencement et PHP
- Référencement local
- Référencement Yahoo
- Référencement Yandex
- Réseaux sociaux
- Sitemaps
- Stratégies de liens
- Stratégies de mots-clés
- Techniques de référencement
- Webmastering
- WebRankInfo
- YouTube
Sites de l'annuaire
- Bartemis : Script d'annuaire PHP mysql
- Script de forum en php et mysql : Faboard
- FreeGlobes : annuaire PHP Mysql
- Trouver un prestataire en développement et création web
- Lingerie d'allaitement et de maternité. Moderne, Féminine et colorée
- Vente de cache oreilles par Booboote Créations
- Alexandre MARMIER webmaster, web développeur à Paris
- Developpeur web freelance PHP mySQL: PedroWill



16 septembre 2010 à 21:14
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.
29 septembre 2010 à 9:00
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.
30 septembre 2010 à 8:51
Merci srouge, j'ai corrigé