-
Notifications
You must be signed in to change notification settings - Fork 0
CacheTool
Le CacheTool est un composant de gestion de cache persistant sur disque. Il permet d'optimiser les performances d'une application en stockant des données coûteuses (résultats de requêtes SQL, calculs complexes, appels API) afin d'éviter des traitements redondants.
Namespace : Magepattern\Component\File\CacheTool
Le CacheTool nécessite un chemin absolu vers un dossier sécurisé, idéalement préparé par le FileTool pour garantir la présence d'une protection .htaccess.
use Magepattern\Component\File\FileTool;
use Magepattern\Component\File\CacheTool;
// Préparation et sécurisation du répertoire
$path = FileTool::createSecureCacheDir('/var/www/project/cache/data');
// Instanciation (TTL par défaut : 1 heure)
$cache = new CacheTool($path, 3600);Invalidation ciblée (Système de Tags) Plutôt que de vider l'intégralité du cache, Magepattern propose un système d'invalidation par Tags. Cela permet une suppression "chirurgicale" des entrées liées à un contexte précis sans affecter le reste de l'application.
- Création avec Tag Lors de la génération de la clé, l'ajout d'un tag permet de grouper les fichiers de cache.
// Exemple : Mise en cache d'une liste d'utilisateurs
$sql = "SELECT * FROM users WHERE active = 1";
$params = [];
// On génère la clé avec le tag 'users'
$key = $cache->generateKey($sql, $params, 'users');
$data = $cache->get($key);
if ($data === null) {
// Récupération des données source...
$cache->set($key, $data);
}- Invalidation du Tag Dès qu'une modification survient dans le périmètre du tag (ex: ajout d'un utilisateur), on vide uniquement ce groupe.
// Supprime tous les fichiers commençant par "users_"
$cache->clearByTag('users');C'est le cas d'usage le plus fréquent pour soulager la base de données.
$qb = (new QueryBuilder())->select('*')->from('mc_cms_page')->where('published = 1');
// 1. Génération de la clé unique
$key = $cache->generateKey($qb->getSql(), $qb->getParams());
// 2. Tentative de récupération
$data = $cache->get($key);
if ($data === null) {
// 3. Si vide, on récupère en BDD
$data = Layer::getInstance()->fetchAll($qb->getSql(), $qb->getParams());
// 4. On enregistre en cache
$cache->set($key, $data);
}- Algorithme SHA-256 : Les clés de cache utilisent une empreinte SHA-256 pour garantir l'unicité et éviter les collisions, même sur des requêtes SQL massives.
- Sérialisation Sécurisée : L'utilisation de unserialize avec l'option allowed_classes => false protège l'application contre les attaques par injection d'objets PHP.
- Intégrité des données : Le verrouillage de fichier (LOCK_EX) prévient la corruption des données lors d'écritures concurrentes.
- Isolation : Le nettoyage des clés par expressions régulières (preg_replace) interdit toute tentative de Path Traversal.
Bien que le FileTool génère une protection par .htaccess, il est fortement recommandé de définir un répertoire de cache situé en dehors du répertoire public (webroot) de votre hébergement. Exemple : Si votre site est dans /httpdocs/, placez votre cache dans /cache_private/. PHP pourra y accéder via un chemin absolu, mais aucune requête HTTP ne pourra l'atteindre.