X. Optimisation▲
X-A. Optimiser un script PHP▲
Une fois que votre application fonctionne parfaitement, vous pouvez essayer d’optimiser son temps d’exécution ou sa consommation de mémoire. Cependant, prenez garde à ne pas tomber dans l’excès.
Optimiser le code PHP est généralement un faux problème pour plusieurs raisons :
- Ce qui prend le plus de temps n’est pas le code PHP, mais les accès réseau (requêtes BDD, webscraping) ou disque (includes) ;
- Un outil de cache d’opcode peut se charger d’optimiser votre code PHP à votre place (dans une certaine mesure) ;
- Optimiser le code à outrance produit habituellement du code très complexe, donc difficile à maintenir.
X-B. Mise en cache▲
La mise en cache vous permet de ne pas exécuter de nouveau du code qui a déjà été exécuté récemment. Cela comporte une notion de temporalité.
Prenez l’exemple d’un site d’actualités dans lequel la page d’accueil présente les actualités les plus récentes. Chaque visiteur de la page d’accueil oblige PHP à envoyer une requête SQL par le réseau, attendre la réponse du SGBD, récupérer les données depuis le socket ouvert pour l’occasion, les traiter puis les afficher. Sachant que le taux de visites est très nettement supérieur à la fréquence de mise à jour des actualités, la très grande majorité des requêtes sont redondantes.
Admettons que notre site d’actualités génère 500 visites quotidiennes, mais qu’il y a tout juste 10 nouvelles actualités par jour. Cela suppose 10 mises à jour de la page d’accueil contre 500 visites : entre 490 et 500 de ces visites quotidiennes obligent donc PHP à effectuer inutilement les traitements résumés ci-dessus…
Une solution de mise en cache serait par exemple de générer le code HTML complet de la page d’accueil à chaque mise à jour de la BDD. Ainsi, aucune requête inutile n’est envoyée au SGBD. Cependant, cette technique n’est pas raisonnable pour la totalité du site à cause de la trop grande quantité potentielle de contenu à compiler à l’avance. De plus, le contenu d’une URL peut changer en fonction de l’internaute. Il faut donc avoir recours à des techniques plus subtiles, et c’est ici que les outils de mise en cache deviennent intéressants.
Exemples d’outils :
- APCAlternative PHP Cache (extension PECL, incluse en standard à partir de PHP6) ;
- eAcceleratoreAccelerator (extension) ;
- memcacheFonctions Memcache (extension PECL)
- Zend_Cache (composant d’un framework) ;
- Zend PlatformZend Platform (application commerciale) ;
- etc.
X-C. Compiler un script PHP▲
Dans certaines situations, il peut être intéressant de compiler son code PHP en bytecode. Nous pourrions par exemple avoir besoin de distribuer notre application sous forme d’exécutable afin d’éviter aux utilisateurs de devoir installer PHP ; une autre raison est simplement de distribuer une application PHP en protégeant son code source (obfuscation).
Exemples d’outils :
- bcompilerCompilateur bytecode pour PHP (extension PECL) ;
- ionCube PHP EncoderionCube PHP Encoder (application commerciale) ;
- WinbinderWinBinder: The native Windows binding for PHP (extension pour Windows) ;
- Zend GuardZend Guard (application commerciale) ;
- etc.
X-D. Compiler PHP▲
N’oubliez pas que compiler PHP peut améliorer les temps de réponse, en particulier si vous êtes sous Windows puisque les exécutables distribués sont compilés contre d’anciennes DLL. Certaines personnes ont remarqué jusqu’à 30 % d’amélioration.
Compiler PHP vous permet aussi d’activer uniquement les extensions dont vous avez besoin, ce qui réduit l’empreinte mémoire.
Je ne vais pas m’étendre sur le sujet, puisqu’il y a beaucoup de concepts qui dépassent le cadre des connaissances requises d’un développeur PHP.
Pour compiler PHP, vous devez également compiler ses dépendances. Certaines sont obligatoires (distribution standard : bindlib, libiconv et libxml2), d’autres sont optionnelles (extensions). Si vous souhaitez compiler PHP pour l’utiliser comme module Apache, vous aurez également besoin de compiler Apache.
Si vous êtes sous un système Unix ou dérivé, vous êtes probablement habitué à compiler les applications avant de les utiliser.
En revanche, si vous êtes sous Windows, sachez que les fichiers binaires distribués sur php.net sont compilés avec Microsoft Visual Studio 6. Ce compilateur n’étant plus distribué par Microsoft, il devient difficile de se le procurer, mais PHP peut être compilé à l’aide d’une version plus récente de Visual Studio. Cependant, il n’est pour le moment pas possible de compiler Apache avec une version plus récente que Visual Studio 6. En résumé, pour compiler PHP comme module Apache, vous avez besoin de Visual Studio 6.
Cela pose certains problèmes outre la disponibilité du compilateur : les nouvelles versions de Visual Studio sont plus efficaces, les binaires compilés sont plus rapides, plus fiables, etc. Il n’y a pour le moment pas de solution à ce problème, seul VS 6 permet de compiler PHP comme module Apache.
Elizabeth Marie Smith est en train de chercher à compiler PHP et toutes ses dépendances avec Visual Studio, version 2005 au minimum. Si vous souhaitez l’aider, rendez-vous sur son blog : http://elizabethmariesmith.com/
X-E. Développer une extension▲
Voici un sujet à la fois vaste et primordial. Il n’est pas demandé à un développeur PHP de savoir développer une extension pour PHP, mais il faut savoir que c’est possible.
PHP étant écrit en langage C, ses extensions suivent naturellement son exemple. Une extension PHP utilise l’API du Zend Engine. Pour rappel, PHP 5 utilise le Zend Engine version 2, tandis que PHP 6 en utilisera la version 3.
Une extension écrite en langage C donne de meilleures performances qu’un script écrit en langage PHP. Dans certaines situations, il peut être intéressant de compiler une extension plutôt que d’écrire un script.
Pour en savoir plus : PHP at the Core: A Hacker's Guide to the Zend Engine