[Webdesign] Creez un système de cache en PHP pour vos éléments HTML


L’un des principaux problèmes des sites Web reste leurs performances. Un site qui se charge rapidement vous donne plus de chance pour retenir vos visiteurs.
Sur les blogs, il y a énormément d’éléments à afficher, rendant le challenge d’autant plus dur à réaliser.

Voila plusieurs semaines (pour ne pas dire plusieurs mois) que je cherche un système pour mettre en cache des parties des mes pages sur ce blog (comme par exemple le nuages de tags colorés sur ma Home).

tagcloud_websourcingfr

J’ai bien entendu regardé ce que fait le plugin WP-SuperCache, mais mon besoin n’est pas de cacher l’ensemble des pages, ni même quelques pages entières, mais bien des parties de pages qui consomme des ressources.

Du coup je m’y suis attelé « à la main ». J’ai finalement trouvé une solution en PHP que je vous livre dans ce billet.

Tout d’abord, il faut créer un fichier pour accueillir le code HTML généré et déterminer sa fréquence de rafraichissement. Il ne faut pas oublier de créer le fichier physiquement sur le serveur et de lui donner les droits d’écriture:

$cacheFile = 'cache/tagcloud.html';  
$cacheFrequency = 3600; // en secondes, ici 1 heure.

Ensuite, il suffit de vérifier l’age du fichier. Si celui-ci a été généré il y a plus de $cacheTime secondes, alors il faut le générer à nouveau :

if (!file_exists($cacheFile) || time() - $cacheFrequency > filemtime($cacheFile)) { 
$handle = fopen($cacheFile , 'w');

/*ce qui suit est ce que je souhaite écrire dans le fichier; dans mon cas, j'appelle une fonction qui me retourne mon tagcloud sous la forme d'un chaine de caractère HTML.*/
$content = wp_colorful_tag_cloud_string(array('title' => ' ', 'number'=> 41));

fwrite($handle, $content);
fclose($handle);
} 

Enfin, il me faut inclure le contenu du fichier sur ma page. Pour cela j’utilise une simple directive « include« :

include($cacheFile ); 

Si je remets le tout ensemble cela donne:

$cacheFile = 'cache/tagcloud.html';  
$cacheFrequency = 3600; // en secondes  

if (!file_exists($cacheFile) || time() - $cacheFrequency > filemtime($cacheFile)) { 
$handle = fopen($cacheFile , 'w');

$content = wp_colorful_tag_cloud_string(array('title' => ' ', 'number'=> 41));

fwrite($handle, $content);
fclose($handle);
} 

include($cacheFile ); 

Cette solution est en place sur mon blog pour la home page et les 2 tagclouds qui y sont présents (dans le header et le footer). Cela me permet d’économiser quelques requêtes SQL puisque le tagcloud en est un grand consommateur.

Notez que pour ce qui est des widgets WordPress, il existe un plugin que j’avais présenté (WP-Widget-Cache, section 2) et qui fait la même chose plus simplement. Encore faut-il avoir « widgetiser » ces parties de pages….

J’ai dans l’idée de rendre la solution plus générique et de généraliser son usage sur les pages « à fort trafic ».