PHP : caches d'opcode et de données
Une description des solutions existantes et de l'avenir des caches pour l'opcode des scripts PHP et pour les caches des données utilisateur.
1. Cache d'opcode.
Il est particulièrement utile, voir indispensable, de disposer d'un cache d'opcode sur un site à fort trafic. Ce mécanisme permet de gagner l'étape d'analyse du code lors du chargement d'un script, en utilisant le résultat stocké en cache. On gagne généralement jusqu'à 80% du temps d'exécution.
1.1. eAccelerator
Site : http://eaccelerator.net/
Cet ancien cache qui fonctionnait jusqu'en PHP 5.3 est définitivement mort.
1.2. XCache
Site : http://xcache.lighttpd.net/
Il s'agit d'une solution éprouvée qui fonctionne jusqu'en PHP 5.4.
Malheureusement, aucune activité ne semble indiquer un support de PHP 5.5 dans un avenir proche.
Paquets : php-xcache, xcache-admin
1.3. APC
Site : http://pecl.php.net/package/APC
Cette extension PECL, gérée par quelques développeurs du projet PHP a longtemps été considérée comme le cache de référence, destiné a être intégré dans PHP.
Malheureusement, le support PHP 5.4 n'a jamais été complet, la version actuelle 3.1.13 est encore en "beta" (la version 3.1.14 a même été retirée).
Le projet a fait le choix de fournir plusieurs fonctionnalités sans rapport entre elles (cache d'opcode, cache de données et gestion des progressions de téléchargement), ce qui est sans doute une erreur.
Il est donc temps de classer cette extension aux archives et d'en envisager les alternatives.
Paquets : php-pecl-apc, php-pecl-apc-devel, apc-panel
1.4. Zend OPCache
Site : http://pecl.php.net/package/ZendOpcache
Il s'agit l'extension propriétaire (Zend Optimiser+) dont le code a été libéré (sous License PHP). Elle est disponible sur PECL pour PHP jusqu'à la version 5.4 et est intégrée à PHP 5.5.
Il s'agit clairement de la solution d'avenir, qu'il est urgent de tester en attendant une version stable officielle.
Paquets : php-pecl-zendopcache (php 5.4) ou php-opcache (php 5.5)
2. Cache des données utilisateur
De nombreuses applications ont besoin de conserver certaines données en cache pour éviter leur calcul à chaque exécution.
Je n'aborderai pas les caches réseaux (permettant le partage de données entre plusieurs machines) comme memcached, redis ou d'autres serveurs NoSQL, même si ils sont très utiles, notamment pour le stockage des sessions, mais uniquement les caches en mémoire, plus simples, permettant de gérer la persistance entre plusieurs requêtes à un même serveur.2.1. XCache
Site : http://xcache.lighttpd.net/
Fonctions : xcache_set, xcache_get, ...
Encore un fois il est dommage de mélanger les genres en associant les 2 types de cache. Espérons tout de même que le projet saura fournir rapidement une version compatible PHP 5.5.
2.2. APC
Site : http://pecl.php.net/package/APC
Fonctions : apc_store, apc_fetch, ...
Dans la branche développement (3.1.5dev), une option a été ajoutée pour désactiver cache d'opcode (apc.enable_opcode_cache=0) ce qui permet d'utiliser Zend OPcache et APC uniquement pour les données utilisateur. C'est vraiment une solution temporaire en attendant une version plus pérenne.
Paquets : php-pecl-apc, apc-admin
2.3. APCu
Site : http://pecl.php.net/package/APCu
Fonctions : même API que APC.
Il s'agit d'un fork (amical) d'APC, destiné à nettoyer le code de toute la partie cache d'opcode et de fournir une alternative permettant de remplacer APC de manière transparente pour les applications.
Les RPM sont déjà disponibles dans le dépôt et vous pouvez commencer à tester cette extension. J'en attends beaucoup. A suivre...
Paquets : php-pecl-apcu, apcu-panel
2.4. Yet Another Cache
Site : https://github.com/laruence/yac
Méthodes : Yac::set, Yac::get, ...
Un nouveau projet initié par l'un des développeurs du langage PHP. Une API objet et une nouvelle conception visant de meilleures performances.
Les RPM sont déjà disponibles dans le dépôt et vous pouvez commencer à tester cette extension prometteuse.
Paquets : php-yac
3. Conclusion
Rien n'est encore bien stable pour PHP 5.5. J'espère que nous verrons les choses se préciser rapidement, avant la version finale.
Personnellement je pense que le bon choix sera PHP 5.5 + Zend OPcache + APCu (pour les applications existantes) + Yac (pour les nouveaux développements).