TUTORIEL PHP 
Optimiser vos applications PHP
La popularité grandissante du Web met une pression croissante sur les logiciels et le matériel utilisé pour les applications. Cet article va vous donner les tuyaux pour réduire la charge de vos serveurs, et augmenter la capacité de vos applications sans avoir à vous ruiner en mises à jour matérielles. (30/03/2004)

(fourni par Direction PHP)

  1. Commencer | 2. Configuer PHP | 3. Optimiser php.ini
4. Au-dela de la configuration | 5. Cacher en mémoire

Avant de commencer notre quête vers la performance, je tiens à vous mettre en garde. Donner plus de rapidité à votre application est certainement un objectif noble, mais malheureusement cela demandera souvent un certain investissement en temps, et nous exposera fréquemment à des bogues. Il est très important que vous ne vous lanciez pas dans l'optimisation prématurée de votre application, car cela vous mènera certainement à l'échec, aussi bien au niveau de la tenue des délais que de la probabilité d'aboutir à un programme fonctionnel.

N'optimisez vos applications que lorsque le code a été écrit complètement, testé, et jugé convenable. Définissez toujours le niveau de performances que vous cherchez à atteindre. Sans objectif précis, vous pourriez passer votre vie à optimiser sans y arriver : car il y aura toujours des trucs et des mises au point supplémentaires que vous pourrez appliquer.

Maintenant que nous nous sommes débarrassés des mises en garde habituelles au sujet de l'optimisation, venons-en à la partie passionnante : le travail lui-même. Vous pouvez certainement gagner une augmentation de performance significative en optimisant votre code PHP, mais c'est souvent un type d'optimisation qu'il vaut mieux garder pour la fin, quand toutes les autres options ont été épuisées. Optimiser un script peut se révéler être un processus sans fin et il y a toujours le risque d'endommager votre code. Autant que possible, il vaut mieux optimiser ce qui aura un impact positif sur les performances de vos applications, mais en dehors de votre code. Comme vous le devinez sûrement, cet article s'intéresse aux optimisations qui n'ont pas besoin de modification de code, et qui permettent à vos applications PHP de s'exécuter plus rapidement.

Pour commencer
La première étape consiste à optimiser l'exécutable PHP lui-même, ce qui permettra aux scripts qu'il exécute de se dérouler plus rapidement. Ceci peut être fait en exigeant plus de votre compilateur C, comme gcc, lors de la compilation de PHP et en configurant l'exécutable binaire qui sera généré pour des performances maximales. Cette optimisation se fait en spécifiant différentes options de configuration au compilateur, via la variable d'environnement CFLAGS. Cette variable est utilisée par le script de configuration, qui passe ensuite ces valeurs au compilateur au moment de la construction. Il est important de noter que, même si je ne mentionne ces options que dans le contexte de PHP, ces indicateurs d'optimisation sont applicables à toutes les parties du système d'exploitation et plus le système est rapide, plus il sera capable de rapidement exécuter tout, y compris vos applications PHP. Ci-dessous se trouve un exemple d'une procédure de compilation PHP modifiée.

export CFLAGS="-O3 -msse -mmmx -march=pentium3 \
-mcpu=pentium3 -mfpmath=sse -funroll-loops"
./configure
make
make install


Que font ces options ? La première, -O3, indique au compilateur quel niveau d'optimisation utiliser. Normalement, PHP n'utilise que -O2, qui est considéré comme étant sûr, sachant que trop d'optimisation peut engendrer des problèmes de stabilité. Ceci dit, étant donné l'évolution des compilateurs, -O3 est, par expérience, tout aussi sûr, et beaucoup de projets l'ont déjà adopté comme leur niveau d'optimisation par défaut. La différence principale entre les deux est que -O3 autorise l'inclusion par référence de fonctions, ce qui permet au compilateur d'optimiser des fonctions en remplaçant des appels de fonction par une copie de leur code. Une autre technique d'optimisation qui est activée avec -O3, est le "recyclage de registre" qui permet au compilateur de profiter de registres inutilisés pour des tâches diverses. Cela est très pratique sur les processeurs modernes avec de nombreux registres qui sont souvent inutilisés.

L'inconvénient de -O3 est qu'il rend le code généré presque impossible à déboguer car le réarrangement du registre crée une situation où un backtrace ne peut pas être généré, en cas de crash du programme. Cependant, comme vous devriez pas rencontrer de crash, et c'est donc une option dont vous pouvez vous passer facilement.

Dans notre commande de compilation ci-dessus, nous avons un groupe d'options qui indiquent au compilateur des détails sur le processeur et ses caractéristiques. Cela permet au compilateur d'appliquer différentes optimisations qui sont spécifiques au processeur (un Pentium III dans notre cas). Cela ne se fait généralement pas lors de la production d'exécutables binaires, car le but est alors de rendre le programme exécutable sur de nombreux environnements. Mais si nous travaillons uniquement pour notre serveur, alors nous n'avons pas cette contrainte, et pouvons profiter des avantages spécifiques de notre architecture.

Bien sûr, permettre un ciblage spécifique au CPU implique que la portabilité du binaire généré sera limitée à un seul type de processeur. Par exemple, du code taillé pour le Pentium III via les options -march et -mcpu ne fonctionnera pas sur des Pentiums plus anciens ni sur des processeurs AMD. Si vous compilez PHP pour une ferme de serveurs qui utilise plusieurs types de processeurs, vous pourriez ne pas avoir envie d'utiliser des options : elles vous obligeraient à compiler un exécutable PHP différent pour chaque type de processeur.

Les trois autres options -msse, -mmmx et -mfpmath=sse indiquent que mon processeur est compatible avec ces groupes d'extensions et spécifient au compilateur qu'il devrait essayer de les utiliser pour générer un code optimal. SSE et MMX sont initialement des groupes d'instructions mathématiques et leur utilisation peut accélérer de manière significative toute opération mathématique que le code C sous-jacent a besoin de réaliser.

La dernière option que je cite -funroll-loops,indique au compilateur qu'il doit développer les petites boucles. La conséquence est la réduction du nombre d'instructions que le processeur doit traiter, car il n'y a plus ou peu de boucles. Cependant, le programme résultant sera un peu plus gros, vu que le code sera répété dans le source autant de fois que nécessaire.

  1. Commencer | 2. Configuer PHP | 3. Optimiser php.ini
4. Au-dela de la configuration | 5. Cacher en mémoire
 
Ilia Alshanetsky pour JDN Développeurs
 
Accueil | Haut de page