Programmation PHP/Cache

Un livre de Wikilivres.

La mémoire cache stocke des données calculées afin de pouvoir y ré-accéder sans les recalculer, donc plus rapidement.

Classification[modifier | modifier le wikicode]

Il existe plusieurs systèmes de cache en PHP pour accélérer l'exécution du code rappelé[1] :

Nom Données stockées Flush
Cache d'instance Objet PHP. Ex :
if (null === $x) {
    $x = 1;
}
Relancer le script (ex : rafraichir la page Web).
Cache de session Objet PHP[2] Vider les cookies du navigateur.
OPcache Opcode[3] opcache_reset();
APCu Variables utilisateurs dans la RAM[4] apcu_clear_cache();
Cache du navigateur Rendering CTRL + F5
ESI Partie de pages Web Dépend du CDN ou proxy utilisé
Cache de framework Configuration, traductions Exemple de Symfony : php bin/console cache:clear vide les fichiers temporaires de var/cache.
Proxy Page web entière Exemples, voir Varnish, HAProxy
Base de données NoSQL Paire clé-valeur Voir les pages Memcached et Redis ci-après.
Cache d'ORM Annotations, requêtes SQL ou leurs résultats Exemple de Doctrine :
php bin/console doctrine:cache:clear-metadata 
php bin/console doctrine:cache:clear-query  
php bin/console doctrine:cache:clear-result

ou :

bin/console cache:pool:clear doctrine.query_cache_pool doctrine.result_cache_pool doctrine.system_cache_pool

ou en PHP :

        $qb = $entityManager->createQuery();
        $cacheDriver = $qb->getResultCacheDriver();
        $cacheDriver->delete('ma_cle_de_cache');
Chain cache Tout Utiliser les flushs de chaque cache inclus dans la chaine.

Les dépendances des caches gérés en PHP se doivent de respecter la norme PSR6[5], c'est-à-dire de fournir les méthodes de manipulation du cache suivantes :

  • hasItem
  • getItem
  • deleteItem
  • clear
  • save

Normalement chaque item a une durée de rétention (lifetime) avant renouvellement, ce qui évite de chercher à tout invalider régulièrement. Voici les opérations sur les items :

  • getKey
  • get (valeur)
  • isHit (est utilisable)
  • set (valeur)
  • expiresAt
  • expiresAfter

Installation[modifier | modifier le wikicode]

OPcache[modifier | modifier le wikicode]

Dans Docker :

RUN docker-php-ext-install opcache

APCu[modifier | modifier le wikicode]

Dans Docker[modifier | modifier le wikicode]

RUN pecl install apcu \
    && docker-php-ext-enable apcu --ini-name 10-docker-php-ext-apcu.ini \
    && docker-php-ext-enable apc --ini-name 20-docker-php-ext-apc.ini \
    && docker-php-ext-enable apc --ini-name 20-docker-php-ext-apc.ini
 Sur PHP < 8.0, ajouter après la première ligne : && pecl install apcu_bc \

Sur machine hôte Linux[modifier | modifier le wikicode]

 sudo pecl install apcu
 echo "extension=apcu.so" >> php.ini

Sur machine hôte Windows[modifier | modifier le wikicode]

Télécharger la DLL sur https://pecl.php.net/package/APCu/5.1.21/windows dans le dossier local des extensions PHP (ex : C:\wamp64\bin\php\php7.4.33\ext).

Dans php.ini, ajouter :

extension=apcu
[apcu]
apc.enabled=1
apc.enable_cli=1

Si ce n'est pas pris en compte, on peut avoir l'erreur "APCu is not enabled".

De plus, on peut personnaliser la configuration par défaut de plusieurs manières. Ex[6] :

apc.shm_size=32M
apc.ttl=7200
apc.enable_cli=1
apc.serializer=php

ou[7]

apc.shm_size=64M
apc.shm_segments=1
apc.max_file_size=10M
apc.stat=1

Références[modifier | modifier le wikicode]