(Article technique – version française)
1. Introduction
Dolibarr est un ERP/CRM open‑source qui a su gagner une popularité durable grâce à sa simplicité d’utilisation et à son architecture modulaire. En 2023‑2024, les performances de Dolibarr sont largement dépendantes du cache mis en place par les développeurs et les intégrateurs (opcache, APCu, Redis, etc.). En 2026, l’évolution des environnements de déploiement (cloud natif, conteneurs, edge computing) et l’émergence de nouvelles extensions PHP obligent à repenser l’architecture du cache.
Cet article vous propose un tour d’horizon complet :
- les principes de base du cache dans Dolibarr,
- les solutions actuelles (2024),
- les évolutions prévues d’ici 2026,
- les recommandations pour préparer votre infrastructure à ces changements.
2. Vue d’ensemble de l’architecture de Dolibarr
| Niveau | Description | Interaction avec le cache |
|---|---|---|
| Front‑office (HTML/JS) | Génération des pages via Smarty templates. | Les rendus sont souvent pré‑rendus et stockés dans le cache (Smarty cache, HTTP cache). |
| Engine PHP | Fichiers *.inc.php qui peuplent les modèles ($object->get(), $object->fetch()). |
Object cache (memcached/Redis) pour les requêtes DB répétées ; *apc/u** pour le bytecode et les données structurées. |
| Base de données | MySQL / MariaDB / PostgreSQL. | Le cache de requêtes SQL (query cache, result cache) permet de servir les mêmes SELECT sans les refaire. |
| API/Services externes | Webhooks, paiements, messageries. | Le cache de réponses HTTP (cURL) évite des appels redondants. |
| Configuration et fichiers | conf.php, fichiers de languages, certificats. |
Un simple filemtime() déclenche le bypass du cache lorsqu’un fichier change. |
Schéma simplifié
[Client HTTP] → [NGINX] → [FPM] → (Cache HTTP/Smarty) → [PHP] →
→ [$ object->fetch() ] → (Cache DB/Redis) → DB →
→ (apc/u** cache) →
→ [Réponse]
3. Les mécanismes de cache « actuels » (2023‑2024)
| Mécanisme | Portée | Implémentation dans Dolibarr | Configuration clé |
|---|---|---|---|
| Smarty cache | Page entière (HTML) | smarty::getCacheInfo(); $smarty->caching = $caching && $GLOBALS['setup']->cache_ld |
cache_lifetime (3600 s par défaut) |
| OPcache | Bytecode + variables PHP | Activez opcache.enable=1 ; opcache.memory_consumption ; opcache.max_accelerated_files |
Le cache est partagé entre tous les scripts. |
| APCu | Cache d’objets PHP (ex. $object->fetch()) |
Utilisé par défaut pour les « state » de certains objets. | apc.enable_cli=1 pour les CLI scripts. |
| Redis / Memcached | Cache de résultats SQL ou de données structurées | Via le module dolibarr-redis-cache ou plugin externe. |
host, port, db, password. |
| HTTP cache (Edge) | Proxies / CDN | Cache-Control: public, max-age=300 ou Vary header. |
Configuration NGINX proxy_cache_key "$scheme$request_method$host$request_uri" |
Points forts actuels
- Granularité : le cache peut être limité au niveau d’un objet (
$object->get()), d’une requête ou d’une page complète. - Détection de changement : le framework compare
md5($file)avec la valeur stockée dans la tablellx...pour réinitialiser le cache lorsqu’un fichier est modifié. - Compatibilité : aucune dépendance externe obligatoire, ce qui facilite le déploiement.
Limites reconnues
- Le cache HTTP repose encore sur la désactivation du cache du navigateur ou sur des contrôles de version manuels (URL avec timestamp).
- Pas de pré‑chauffage automatisé des caches critiques (ex. catalogue produit).
- Manque d’intégration native de Cache‑Aside (pattern) ou de Cache‑Linearization pour les méta‑données complexes.
- L’OPcache ne profite pas d’une purge fine‑grained (seulement de l’ensemble du processus).
4. Projection 2026 : Quels changements architecturaux ?
4.1. Le Cache‑Aside 2.0 intégré nativement
- Concept : le service « cache‑aside » sera fourni comme service centralisé (ex.
CacheInterface) accessible depuis n’importe quel composant (object, repository, worker). - Implémentation : un PSR‑6‑like mais plus léger (
DolibarrCacheInterface) offrantget($key),set($key,$value, $ttl),fetch($key, $callable)où le$callableest le code qui récupère les données depuis la DB si le cache est manquant. - Avantages :
- Suppression totale du cache warming manuel.
- Gestion automatique de la baisse de TTL liée à la charge du serveur (dynamic TTL).
4.2. Cache distribué natif en NATS‑Streaming / Kafka
- En 2026, les environnements Kubernetes sont majoritairement event‑driven.
- Dolibarr pourra s’abonner à un topic qui logge les événements « ObjectUpdated », et publier des instructions de ré‑initialisation de cache vers d’autres pods.
- Le pattern « Cache‑Invalidation‑Bus » deviendra standard (ex.
dolibarr-cache-eventbus).
4.3. Edge‑Ready / CDN‑First
- Les CDN à la Cloudflare Workers ou à l’edge de Vercel permettent d’intercepter les requêtes PHP via les fonctionnalités response‑cache des Edge Functions.
- Dolibarr 2026 intégrera un Header‑Based Cache‑Control configurable :
Cache-Control: public, max-age=7200, stale-while-revalidate=300. - Le service
dolibarr-cdn-middlewaresérialise les réponses HTML dans des formats JSON/Protobuf, rendant le cache HTTP beaucoup plus efficace.
4.4. Lazy‑Loading & Asynchronous Rendering
- Les pages de liste sont de plus en plus rendues de façon progressive (React/Preact ou Vue) côté client.
- Dolibarr 2026 exposera API‑JSON qui renvoient les données déjà pré‑cachées (par le Cache‑Aside). Les vues côté serveur ne font que préparer le JSON; le rendu final est delegué à l’UI.
- Le serveur ne fait plus de Smarty complet ; il se contente de injecter les modèles déjà en cache sous forme de fragments.
4.5. Gestion du TTL adaptative
- Grâce à un metastore partagé (ex. Redis Streams), chaque cache entry pourra avoir un TTL dynamique en fonction de la fréquence d’accès et du hotness du contenu.
- Le plugin
CacheTtlAdaptorutilise le machine‑learning léger (viaphp-ml) pour prédire la durée de vie optimal.
5. Scénario d’utilisation 2026 : Implémentation concrète
5.1. Installation recommandée
| Élément | Version recommandée (2026) | Raison |
|---|---|---|
| PHP | 8.3+ (opcache + apcu + redis) | Opcache 3.2 introduit le opcache.validate_timestamps=1n avec purge granulaire. |
| NGINX | 1.27+ (cache + http2) | Support natif du Cache‑Aside Header et du edge cache partagé. |
| Redis | 7.2 (client PHP phpredis 6.0) |
Supporte les Lua scripts de purge atomique. |
| Docker | dolibarr:2026 (multi‑stage) |
Contenu minimalisé, multi‑arch. |
| Kubernetes | Helm chart dolibarr-cache-2026 |
Gestion auto‑scaling du cache Redis & du worker de purge. |
5.2. Configuration du Cache‑Aside
// src/Dolibarr/Cache/CacheAside.php
namespace Dolibarr\Cache;
class CacheAside implements CacheInterface
{
private CacheInterface $backend; // Redis ou APCu
private int $defaultTtl = 3600;
public function __construct(CacheInterface $backend, int $defaultTtl = 3600)
{
$this->backend = $backend;
$this->defaultTtl = $defaultTtl;
}
public function get(string $key)
{
return $this->backend->get($key);
}
public function set(string $key, $value, int $ttl = -1)
{
$ttl = ($ttl > 0) ? $ttl : $this->defaultTtl;
$this->backend->set($key, $value, $ttl);
}
/**
* Cache-Aside pattern
*/
public function fetch(string $key, callable $loader, int $ttl = -1)
{
$value = $this->get($key);
if ($value === null) {
$value = $loader(); // <- récupère depuis DB
$this->set($key, $value, $ttl);
}
return $value;
}
}
Utilisation dans le repository d’un objet :
public function getByNumber(int $num) : DoliObject
{
$key = "object_$num";
return $cache->fetch($key, fn() => $this->loadFromDb($num));
}
5.3. Purge atomique via Lua script
-- purge_key.lua
local key = KEYS[1]
redis.call('EXPIRE', key, 0) -- supprime immédiatement
return 1
Concernant le module
dolibarr-redis-cache: le plugin utilise ce script viaredis->evalsha().
5.4. Exemple de configuration NGINX pour le Cache‑Aside Header
location / {
proxy_pass http://php-fpm;
proxy_set_header Host $host;
# Ajoute les en-têtes de cache générés par le script PHP
add_header Cache-Control "public, max-age=7200, stale-while-revalidate=120";
# Soporte de Cache‑Aside via le header 'X-Cache-Aside'
if ($sent_http_x_cache_aside = "hit") {
add_header X-Cache-Aside "true" always;
}
}
6. Bonnes pratiques à adopter dès aujourd’hui
| Action | Pourquoi | Exemple concret |
|---|---|---|
Activer opcache.validate_timestamps=0 en prod |
Réduit le coût de la validation du bytecode. | Dans php.ini : opcache.validate_timestamps=0 |
| Utiliser APCu pour les petites métriques | APCu est plus rapide que Redis pour < 1 KB. | $apc->add('module_status_12', $status, 600); |
| Pré‑charger le cache des listes statiques | Évite le « cold‑start » après un déploiement. | Cron : curl -s http://my.dolibarr.local/llx/menu/mainmenu.php?mainmenu_token=12345 > /dev/null |
Configurer Cache-Control sur les API JSON |
Les clients mobiles peuvent mettre en cache côté browser. | header('Cache-Control: public, max-age=300'); |
Mettre en place un Cache‑Bus |
Synchronise la purge entre plusieurs instances. | Publier sur Redis Stream cache-updates chaque fois que llx.object est mis à jour. |
| Surveiller le hit‑ratio | Détecter les caches sous‑utilisés ou sur‑utilisés. | Prometheus metric dolibarr_cache_hit_ratio. |
Versionner les clés (ex. object_42_v202411) |
Permet d’appliquer de la stale‑while‑revalidate sans perdre de données. | $key = "product_{$product->id}_{$product->version}"; |
7. Scénario de migration vers 2026
| Étape | Durée | Action clé | Résultat attendu |
|---|---|---|---|
| 1 – Audit | 2 semaines | Mesurer hit‑ratio, identifier les goulots d’étranglement (SQL repeat, page rendering). | Rapport de performance ; liste des objets « hot ». |
| 2 – Test de Cache‑Aside | 1 mois | Implémenter le --‑CacheAside en environnement de test. |
15‑30 % de réduction du temps de réponse sur les listes de produits. |
| 3 – Migration du Cache Engine | 2 mois | Passer de Redis à Redis + Lua Purge + OPcache 3.2. |
Élimination des « stale cache » liés à la propagation. |
| 4 – CDN + Edge‑Cache | 1 mois | Ajouter le middleware dolibarr-cdn-middleware. |
Diminution du load‑balancer de 40 %. |
| 5 – Automatisation du Warm‑up | 2 semaines | Script cron qui lance les API “popular‑items”. | Cache rempli avant les pics de trafic (Black Friday). |
| 6 – Go‑Live 2026 | – | Déployer sur Kubernetes avec autoscaling du cache Redis. | Architecture prête pour des charge > 10 k RPS avec < 150 ms latence moyenne. |
8. Conclusion
L’architecture du cache dans Dolibarr est déjà riche et modulable, mais le parcours 2026 introduit trois leviers majeurs :
- Cache‑Aside natif (pattern centralisé, TTL adaptatif) ;
- Cache distribué orienté events (Redis Streams/Nats‑Streaming) ;
- Edge‑Ready / CDN‑First avec gestion fine du
Cache‑Controlcôté serveur.
En combinant ces évolutions avec les bonnes pratiques ci‑dessus, les organisations pourront :
- Réduire de 30 % à 50 % le temps de réponse des pages critiques,
- Diminuer la consommation de ressources serveur (CPU, RAM) de 20‑30 %,
- Garantir une meilleure résilience face aux pics de trafic grâce à la purge atomique et au pré‑chauffage automatisé.
En résumé, préparer Dolibarr à 2026 consiste à externaliser le cache comme un service, à rendre les invalidations event‑driven, et à exploiter les capacités modernes du stack PHP/NGINX. Une implémentation progressive, testée en environnement isolé, vous donnera la certitude que votre ERP restera performant et évolutif pendant les prochaines années.
À retenir : le futur du cache dans Dolibarr, c’est la convergence service‑oriented cache + event‑driven invalidation + edge‑first delivery. En adoptant dès maintenant les patterns décrits, vous serez paré pour 2026 et au‑delà.
Merci pour votre lecture ! Vous avez des questions sur une implémentation précise ? N’hésitez pas à les poser en commentaire ou à me contacter directement.