Articles

Il existe de nombreuses possibilités pour accélérer le rendu d'une page web dynamique et le sujet est vaste. En effet, la génération d'une page php fait appel à différents intermédiaires physiques ou logiciels.
Ainsi des optimisations sont possibles au niveau d'apache, de mysql, des disques durs ou pourquoi pas du noyau linux pour les plus avertis. C'est ce que l'on a coutume d'appeler du "tuning" avec des résultats variables et pas toujours simples à obtenir ou à quantifier.

Parmi toutes ces solutions, il existe un moyen assez simple et spectaculaire à mettre en place pour réduire de manière significative (parfois plus de 50%) le temps d'exécution d'un script. Il s'agit d'eaccelerator.

Qu'est ce qu'eaccelerator ?

Php étant un langage de script non compilé, il est plutôt lent à l'exécution. A chaque demande, le script est analysé, puis "compilé" en opcode (précompilé) avant d'être exécuté.

Eaccelerator est un moteur de mise en cache d'opcode php. Lors de son premier appel sur un script php, eaccelerator intervient pour stocker en mémoire volatile ou physique une version pré-compilée du code php, de manière à gagner du temps lors des appels suivants.
A chaque exécution d'un script, eaccelerator vérifie si celui à été modifié depuis la dernière mise en cache et si ce n'est pas la cas, il exécute la version déjà compilée. D'où un gain de temps très significatif sauf pour la première exécution qui est en général assez longue (compilation + mise en cache).

Téléchargement

Eaccelerator est disponible depuis le site officiel ( http://eaccelerator.net ).

Pour ce tuto j'ai utilisé la version 0.9.5.2 d'Eaccelerator avec Php 5 et Apache 2 sur Debian Etch.

On commence donc par télécharger la dernière version d'eaccelerator.
wget http://bart.eaccelerator.net/source/0.9.5.2/eaccelerator-0.9.5.2.tar.bz2

On installe ensuite le paquet php5-dev qui va nous fournir la commande phpize nécessaire pour la compilation d'eaccelerator.
apt-get install php5-dev

Installation

Eaccelerator doit être compilé. On va donc commencer par extraire le contenu de l'archive
tar jxvf eaccelerator-0.9.5.2.tar.bz2
On va ensuite dans le dossier contenant les sources
cd eaccelerator-0.9.5.2
Puis on exécute les commandes suivantes :
export PHP_PREFIX="/usr"
$PHP_PREFIX/bin/phpize
La commande phpize est utilisée pour préparer l'environnement de compilation pour une extension PHP.

On peut ensuite compiler eaccelerator...
./configure \
--enable-eaccelerator=shared \
--with-php-config=$PHP_PREFIX/bin/php-config

make

... puis l'installer (en passant root !)
make install

Le script d'installation vous indique pour terminer à quel endroit a été copié le module (eaccelerator.so), soit quelque chose de ce genre :
Installing shared extensions:     /usr/lib/php5/20060613+lfs/

La dernière étape consiste à indiquer à php où trouver et comment utiliser eaccelerator.
Le code source contient un fichier de configuration type d'eaccelerator. Il est pratique pour bien comprendre les différentes options mais un peu trop épais pour être clair en production ;-)

La solution la plus simple consiste à copier le fichier d'exemple dans le dossier de configuration de php :
cp eaccelerator.ini /etc/php5/conf.d/
Il faut ensuite modifier le fichier pour adapter la configuration. Vous pouvez également créer un fichier "from scratch" :
nano /etc/php5/conf.d/eaccelerator.ini

Config / Solution 1
Si vous modifiez le fichier d'origine, remplacez
eaccelerator.cache_dir = "/tmp/eaccelerator"
par
eaccelerator.cache_dir = "/var/cache/eaccelerator"

Décommentez également la ligne...
extension="eaccelerator.so"
... et commentez la ligne
;zend_extension="/usr/lib/php4/eaccelerator.so"

Config / Solution 2
Si vous préférez créer un fichier de configuration "from scratch" :
extension="eaccelerator.so"
eaccelerator.shm_size = "0"
eaccelerator.cache_dir = "/var/cache/eaccelerator"
eaccelerator.enable = "1"
eaccelerator.optimizer = "1"
eaccelerator.debug = 0
eaccelerator.log_file = "/var/log/httpd/eaccelerator_log"
eaccelerator.name_space = ""
eaccelerator.filter = ""
eaccelerator.shm_max = "0"
eaccelerator.shm_ttl = "0"
eaccelerator.shm_prune_period = "0"
eaccelerator.shm_only = "0"
eaccelerator.compress = "1"
eaccelerator.compress_level = "9"
eaccelerator.keys     = "shm_and_disk"
eaccelerator.sessions = "shm_and_disk"
eaccelerator.content  = "shm_and_disk"
eaccelerator.allowed_admin_path = ""

Pour terminer, rechargez la config d'apache
/etc/init.d/apache reload

Vous pouvez vérifier la prise en charge d'eaccelerator en affichant la version de php :
php -v

Vous devriez obtenir quelque chose du genre
with eAccelerator v0.9.5.2, Copyright (c) 2004-2006 eAccelerator, by eAccelerator

Et bien sûr vous devriez observer des gains significatifs de performances pour vos pages php...

Mise à jour

Si vous mettez à jour votre version de php (via apt/aptitude), n'oubliez surtout pas de recompiler eaccelerator sous peine de voir apache planter au redémarrage !
export PHP_PREFIX="/usr"
$PHP_PREFIX/bin/phpize
./configure \
--enable-eaccelerator=shared \
--with-php-config=$PHP_PREFIX/bin/php-config
make clean
make
make install