Mise en cache en PHP : Redis et autres outils
La mise en cache est l'un des mécanismes clés pour optimiser les performances des applications web en PHP. Une mise en cache correctement configurée permet de réduire le temps de réponse du serveur de 10 à 50 fois, de diminuer la charge sur la base de données et de réduire la consommation de ressources. Dans cet article, nous aborderons quatre approches principales de la mise en cache en PHP : Redis, Memcached, APCu et la classique mise en cache de fichiers.
Pourquoi la mise en cache en PHP est-elle nécessaire ?
Sans mise en cache, chaque requête PHP peut exécuter des dizaines de requêtes SQL, traiter des modèles et charger des données externes. La mise en cache enregistre le résultat d'une opération coûteuse (par exemple, une extraction de base de données ou l'analyse d'un fichier XML) et le restitue directement, évitant ainsi des calculs répétés. Les principaux scénarios d'utilisation :
- Mise en cache des résultats de requêtes SQL — nous enregistrons le résultat d'une requête SELECT pendant 5 à 60 secondes.
- Mise en cache de fragments HTML — blocs de menu prêts à l'emploi, widgets, fils d'Ariane.
- Mise en cache des sessions — stockage des données de session dans Redis au lieu de fichiers.
- Mise en cache des données d'API — réponses de services externes (météo, taux de change).
- Mise en cache du code opcode — accélération de l'exécution du code PHP lui-même (OPcache).
1. Redis — le roi de la mise en cache in-memory
Redis est un magasin de données clé-valeur in-memory hautes performances prenant en charge des structures complexes (listes, hachages, ensembles). Pour PHP, il existe plusieurs clients : predis/predis (PHP pur) et ext-redis (extension C).
Exemple d'installation via Composer :
composer require predis/predisExemple de base de mise en cache avec Redis :
<?phprequire 'vendor/autoload.php';
use Predis\\Client;
$redis = new Client([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379,]);
$cacheKey = 'user_list_page_1';$ttl = 300; // 5 minutes
// Tentative de récupération des données depuis le cacheif ($redis->exists($cacheKey)) { $data = unserialize($redis->get($cacheKey)); echo "Données du cache";} else { // Opération coûteuse (par exemple, requête SQL) $data = getUsersFromDatabase(1, 20); $redis->setex($cacheKey, $ttl, serialize($data)); echo "Données de la BDD";}
print_r($data);Avantages de Redis : vitesse (millisecondes), prise en charge du TTL, opérations atomiques, Pub/Sub, persistance sur disque. Inconvénients : nécessite un serveur dédié, consommation de mémoire vive.
2. Memcached — simplicité et vitesse
Memcached est un autre magasin in-memory populaire, mais sans structures de données complexes. En PHP, l'extension memcached est utilisée (notez la lettre d — il s'agit de la version la plus récente).
Installation de l'extension :
sudo apt install php-memcachedExemple de travail avec Memcached :
<?php$memcached = new Memcached();$memcached->addServer('127.0.0.1', 11211);
$key = 'article_42';$data = $memcached->get($key);
if ($memcached->getResultCode() === Memcached::RES_NOTFOUND) { $data = fetchArticleFromDB(42); $memcached->set($key, $data, 3600); // 1 heure echo "Requête à la BDD";} else { echo "Depuis le cache Memcached";}Quand choisir Memcached : si vous avez besoin d'une mise en cache simple de chaînes sans structures complexes et que vous ne souhaitez pas configurer la persistance. Memcached est plus rapide que Redis pour les opérations simples get/set, mais est moins fonctionnel.
3. APCu — mise en cache directement en PHP
APCu (Alternative PHP Cache) est une extension pour la mise en cache de données dans la mémoire partagée du processus PHP actuel. Elle ne nécessite pas de serveur séparé.