Mise en cache d’un site

Publié le 18 octobre 2011 - Developpement Web. Tags : , , , ,

N’ayant rien de spécial à publier cette semaine, j’ai décidé de vous présenter un petit script de mise en cache de vos pages internet. Avant de commencer, la mise en cache c’est quoi ? Grosso modo la création d’une page html statique à partir d’une page dynamique, mise à jour à intervalles réguliers. Le but est bien évidemment d’économiser des requêtes SQL, ressources PHP, etc. et d’accélérer la vitesse de chargement de votre site. En bonus, vu que l’affichage est statique, vous limitez par la même occasion les problèmes inhérents aux injections et autres réjouissances.

C’est une technique extrêmement efficace, on peut facilement gagner 50% de temps de chargement, et selon les cas, monter jusqu’à un gain de 95% !

Il existe différentes façons de cacher ses pages web, allant d’une mise en cache complète d’une page à une mise en cache partielle (le plus fréquent). L’idée est de ne lancer une même requête qu’une fois plutôt que de l’exécuter à chaque affichage.

Prenons un exemple pratique : vous avez une page nécessitant 5 requêtes pour générer une page complète, et cette page est vue 100 fois par jour. A la fin de la journée, vous avez donc exécuté 500 requêtes (100×5) alors qu’avec une mise en cache, cela n’aurait nécessité que 5 requêtes (celles de l’affichage de base). Bref vous auriez économisé 495 requêtes sur la journée, ou près de 3500 requêtes sur une semaine (l’intervalle de mise en cache dépend de la fréquence de mise à jour, c’est vous qui décidez). Je vous laisse imaginer la différence si votre page s’affichait 1000 fois/jour… les économies de ressources sont juste ENORMES !

Assez papoté, voyons comment intégrer un tel système sur son site. Comme d’habitude, il existe des classes PHP toutes prêtes, mais pour bien comprendre le fonctionnement d’une telle technique rien ne vaut un exemple pratique simple (100% fonctionnel).

Imaginons que votre page soit générée par une requête, et qu’une deuxième requête soit nécessaire pour enregistrer le nombre de vues de vos pages. Vous auriez donc quelque chose de la sorte sans système de mise en cache :

//requete #1
$req = mysql_query("SELECT....");
//boucle
while($val = mysql_fetch_assoc($req)) {
echo $val .... ;
}
//Requête #2, (mise à jour des vues par exemple)
mysql_query("UPDATE....");
<!-- Du HTML -->

Si votre première requête concerne un contenu pas mis à jour plus d’une fois par jour, pourquoi ne pas la mettre en cache et actualiser la page une fois par jour ?

Pour procéder, voici comment faire :

  1. Créez un répertoire ‘cache’ où seront localisées vos pages/requêtes cachées, avec un CHMOD 777  au niveau des droits d’écriture, afin d’y autoriser la création de fichiers.
  2. Créez un fichier index.html vide, et placez-le à la racine (pour éviter de lister les fichiers du répertoire)

Maintenant nous, allons éditer le code de votre page afin de créer le cache de votre requête. Le procédé est assez simple : votre script vérifie la date de dernière modification de votre fichier cache, si cette date est trop ancienne par rapport à l’intervalle de mise à jour prédéfinit, le cache est actualisé. Et inversement, si le cache n’est pas périmé, on l’affiche à la place de votre requête.

Voici ce que votre précédent code donnerait :

//dernière mise à jour du cache
$last_update = time() - filemtime('cache/req.cache');
//Intervale de mise à jour (ici : 1h)
$update_int = 60*60;
 
//Si le cache est périmé : mise à jour
if($last_update &gt; $update_int) { 
 
	//Requete
	$req = mysql_query("SELECT....");
 
	ob_start(); //Début de la temporisation de sortie
 
	//Boucle d'affichage des résultats
	while($val = mysql_fetch_assoc($req)) {
		echo $val....;
	}
 
	$Content = ob_get_contents(); //Retourne le contenu du buffer de sortie
	ob_end_clean(); //destruction tampon
 
	//mise à jour du fichier cache
	$ContentFile = fopen('cache/req.cache', 'w+'); //Créé s'il n'existe pas (w+)
	fwrite($ContentFile, $Content);
	fclose($ContentFile);
 
//Sinon: on affiche le cache
} else {
	$GetCache = @file_get_contents('cache/req.cache'); //@ parce que si ça plante, c'est moche...
	echo $GetCache;
}

Tout est commenté donc cela ne devrait pas vous poser de problèmes, néanmoins, notez que cet exemple fonctionne pour une requête isolée, pour mettre en cache une plus grande partie de la page, il faut décaler les ob_start() et ob_get_content() aux endroits désirés (ob_start() est géré par piles au passage). De même, selon la taille de votre site, il fait prévoir une création automatique des fichiers cache (attention aux doublons !).

Ici, vous devez garder votre deuxième requête concernant la mise à jour des vues, ou sinon vous n’enregistrez plus les hits sur votre page. Il s’agit en fait une mise en cache partielle. Je vous laisser adapter ce bout de code à votre guise ;)

nb. Même si cela fonctionnerait, cet article n’est pas spécifiquement lié à WP, pour cela des plugins (fonctionnant sur ce principe) existent. Mon préféré: Quick cache.

 


Articles sur ce thème :
Aucun article lié.