Mise en cache en PHP : Redis, Memcached et solutions intégrées
La mise en cache est l'un des outils clés pour améliorer les performances des applications web. En PHP, le développeur a accès à plusieurs approches : du simple cache fichier aux puissants systèmes in-memory comme Redis et Memcached. Dans cet article, nous analyserons en détail chaque option, fournirons des exemples de code et vous aiderons à choisir la solution optimale pour votre projet.
Pourquoi la mise en cache est-elle nécessaire ?
Sans mise en cache, chaque requête sur un site peut entraîner des calculs répétés, des requêtes à la base de données ou à des API externes. Le cache permet de stocker le résultat d'une opération coûteuse et de le restituer à partir d'un stockage rapide. Principaux cas d'utilisation :
- Stockage des résultats de requêtes SQL (notamment les agrégations et les JOIN).
- Mise en cache de fragments HTML (par exemple, menus, barres latérales).
- Stockage des sessions utilisateur.
- Mise en cache des réponses d'API externes.
1. Redis — le roi de la mise en cache in-memory
Redis est un magasin de données en mémoire hautes performances, prenant en charge les structures de données : chaînes, listes, hachages, ensembles. Pour PHP, il existe plusieurs clients, les plus populaires étant predis/predis (PHP pur) et phpredis (extension en C).
Installation
composer require predis/predisExemple : mise en cache du résultat d'une requête à la base de données
<?phprequire 'vendor/autoload.php';
use Predis\\Client;
$redis = new Client([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379,]);
function getUsersFromDb() { // Simulation d'une requête longue sleep(2); return ['user1', 'user2', 'user3'];}
$cacheKey = 'users:all';$cached = $redis->get($cacheKey);
if ($cached) { $users = json_decode($cached, true); echo "Depuis le cache : ";} else { $users = getUsersFromDb(); $redis->setex($cacheKey, 3600, json_encode($users)); // TTL 1 heure echo "Depuis la base : ";}
print_r($users);Fonctionnalités clés de Redis :
setex()— définition d'une clé avec une durée de vie (TTL).expire()— définition d'un TTL pour une clé existante.del()— suppression d'une clé.incr()— incrémentation atomique (compteurs).
2. Memcached — simplicité et rapidité
Memcached est un autre système in-memory populaire, mais contrairement à Redis, il ne prend en charge que les valeurs de type chaîne et ne dispose pas de structures de données intégrées. Cependant, pour une mise en cache simple, il est plus rapide grâce à son minimalisme.
Installation de l'extension
sudo apt install php-memcached# ou via pecl :pecl install memcachedExemple : mise en cache d'un fragment HTML
<?php$memcached = new Memcached();$memcached->addServer('127.0.0.1', 11211);
function renderMenu() { // Génération coûteuse du menu return '<nav><ul><li>Accueil</li></ul></nav>';}
$menuHtml = $memcached->get('menu:main');if ($menuHtml === false) { $menuHtml = renderMenu(); $memcached->set('menu:main', $menuHtml, 600); // TTL 10 minutes}
echo $menuHtml;Important : Memcached ne prend pas en charge le TTL en secondes par défaut — le temps est spécifié en secondes (nombre entier). Si vous transmettez 0, le cache sera stocké indéfiniment.
3. APCu — mise en cache intégrée en PHP
APCu (Alternative PHP Cache) est une extension pour la mise en cache de données dans la mémoire partagée d'un seul serveur. Idéal pour les applications monopages et les petits projets.
Installation
sudo apt install php-apcuExemple : mise en cache de la configuration
<?php$configKey = 'app:config';
if