Ajouter un système de cache sur son site

Voici cette fois une fonction afin de réaliser un système de cache en PHP sur votre site.

Il servira à économiser les ressources de votre serveur, en mettant en cache par exemple les requêtes à votre base de données.

 1 //+ Maigret Aurélien
 2 //@ https://www.dewep.net
 3 class Cache
 4 {
 5     private $root = '';
 6 
 7     public function is_cached($id, $temps_cache = 10800)
 8     {
 9         $temps_cache = (!is_numeric($temps_cache)) ? 10800 : $temps_cache;
10 
11         $fichier_cache = $this->root . 'caches/' . basename($id) . '.cache';
12 
13         if (!file_exists($fichier_cache) || (time() - filemtime($fichier_cache)) > $temps_cache)
14         {
15             return false;
16         }
17         return true;
18     }
19 
20     public function read_cache($id)
21     {
22         $fichier_cache = $this->root . 'caches/' . basename($id) . '.cache';
23 
24         if (!file_exists($fichier_cache))
25         {
26             return '';
27         }
28         return unserialize(file_get_contents($fichier_cache));
29     }
30 
31     public function write_cache($id, $contenu)
32     {
33         $fichier_cache = $this->root . 'caches/' . basename($id) . '.cache';
34 
35         return file_put_contents($fichier_cache, serialize($contenu));
36     }
37 
38     public function delete_cache($id)
39     {
40         $fichier_cache = $this->root . 'caches/' . basename($id) . '.cache';
41 
42         return unlink($fichier_cache);
43     }
44 }

Vous devez créer à votre racine un dossier caches (et accessible en écriture ; et n'oubliez pas de protéger ce répertoire avec un htaccess par exemple).

Indiquer à la variable $root de la class le chemin pour aller à la racine de votre site.

Ensuite, dans votre fichier PHP, commencez par créer une variable pour la classe.

1 $systeme_cache = new Cache();

Imaginons maintenant que vous ayez une requête que vous faites très régulièrement sur votre site (à chaque chargement de page par exemple) :

1 $query = $bdd->query("SELECT champ_1, champ_2
2     FROM table
3     WHERE champ_3 = 1
4     ORDER BY champ_4 DESC
5     LIMIT 5");
6 $resultat = $query->fetchAll();

On commence par donner un identifiant à votre requête (on prendra champs_table_1). On vérifie alors s'il existe une version en cache pour cet identifiant et s'il est encore valable.

Si ce n'est pas le cas, alors on exécute la requête et l'on sauvegarde le résultat dans le cache. Sinon, on lit notre cache.

 1 if (!$systeme_cache->is_cached('champs_table_1'))
 2 {
 3     // Le cache de notre requête n'a pas encore été créé ou il est trop ancien
 4 
 5     // On exécute notre requête
 6     $query = $bdd->query("SELECT champ_1, champ_2
 7         FROM table_1
 8         WHERE champ_3 = 1
 9         ORDER BY champ_4 DESC
10         LIMIT 5");
11     $resultat = $query->fetchAll();
12 
13     // Puis on le sauvegarde dans le cache
14     $systeme_cache->write_cache('champs_table_1', $resultat);
15 }
16 else
17 {
18     // Le cache de notre requête est valide, on le récupère
19 
20     $resultat = $systeme_cache->read_cache('champs_table_1');
21 }

Par défaut, le cache dure 3 heures (10800 secondes). Vous pouvez changer cette valeur dans la classe, ou alors forcer une autre valeur en ajoutant un deuxième paramètre à la méthode is_cached :

1 if (!$systeme_cache->is_cached('champs_table_1', 3600)) {
2     // ...
3 }

PHP MySQL Cache

Article publié le 1 Octobre 2012.

Commentaires