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 }