Programmation PHP/Cache
La mémoire cache stocke des données calculées afin de pouvoir y ré-accéder sans les recalculer, donc plus rapidement.
Classification
modifierIl 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
modifierOPcache
modifierDans Docker :
RUN docker-php-ext-install opcache
APCu
modifierDans Docker
modifierRUN 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
&& pecl install apcu_bc \
Sur machine hôte Linux
modifiersudo pecl install apcu echo "extension=apcu.so" >> php.ini
Sur machine hôte Windows
modifierTé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- ↑ http://www.php-cache.com/en/latest/
- ↑ https://www.php.net/manual/fr/session.security.php
- ↑ https://www.php.net/manual/fr/intro.opcache.php
- ↑ https://www.php.net/manual/fr/intro.apcu.php
- ↑ https://www.php-fig.org/psr/psr-6/
- ↑ https://stackoverflow.com/questions/24448261/how-to-install-apcu-in-windows
- ↑ https://phpflow.com/php/how-to-install-apc-cache-on-wamp-and-xampp/?utm_content=cmp-true