Hautes performances avec CakePHP – Joël Perras
Voici donc la dernière conférence de ce CakeFest, sur un sujet on ne peut plus important pour toutes les personnes souhaitant utiliser le framework pour des applications critiques ou très sollicitées : la performance. Tout au long de cette présentation, Joël Perras a mentionné divers outils utiles pour effectuer des tests de performance et optimiser son application.
Il a commencé par dire la chose suivante : il ne faut pas croire ce que l’on vous présente et les méthodes d’optimisation données tant que vous ne les avez pas expérimentées et testées par vous même. Il n’existe pas de recette miracle pour optimiser une application, et cela dépend réellement du type d’application que l’on a. Par exemple, il ne sert à rien d’essayer de gagner des quarts de ms sur le côté serveur d’une application alors que le côté client (Javascript) est mal codé et ralenti l’affichage de la page : l’utilisateur ne fait pas de différence au final ! Vous êtes donc avertis … testez ce qui est présenté ici sur vos applications !

Lorsque l’on doit gérer la mise à l’échelle d’une application il y a deux choix possibles : scalabilité verticale (ajouter un serveur supplémentaire) ou scalabilité horizontale (rajouter de la RAM sur le serveur existant). Si jamais vous avez les moyens de le faire et que cela vous permette de satisfaire vos attentes il ne faut pas hésiter, utilisez la solution de facilité ! Si jamais vous pensez qu’il vaut mieux travailler sur l’application en elle-même alors c’est parti !
En tant que développeur PHP, une des meilleures choses à comprendre lorsqu’il s’agit d’optimisation est le fonctionnement même de PHP. En effet, il est intéressant de bien comprendre ce qui se passe entre la lecture du fichier texte *.php et la génération du HTML correspondant. A partir de là il est plus simple de comprendre à quel endroit il faut agir pour optimiser son application, ou la benchmarker. Voici par exemple le fonctionnement simplifié trouvé sur Wikipédia :

Voici donc trois outils intéressants pour améliorer les performances de votre application :
- APC : cache de code intermédiaire (opcode) pour PHP, il vous permet d’optimiser et de mettre en cache ce type de code afin d’accélérer certaines étapes de l’interpréteur PHP
- MemCache : système permettant de mettre en cache les appels vers les bases de données afin de réduire encore une fois la charge serveur
- Gearman : le système central permettant de répartir la charge sur vos serveurs lors d’applications distribuées
Afin de choisir le meilleur outil de cache, mieux vaut savoir exactement quelles parties de son application doivent être optimisées. C’est donc par là que tout commence si on ne veut pas travailler pour rien : trouver son point faible ! Pour cela, Joël a présenté l’outil Siege qui est l’outil par excellence à avoir dans votre boîte à outil pour réaliser des benchmarks ! Cette application se charge de générer des connexions simultanées sur votre site, permettant ainsi de déterminer comment votre application monte en charge. Un outil à peu près équivalent a également été mentionné : Apache AB. Voici un exemple d’appel à Siege pour tester les performances de Cakephp.org, et le résultat obtenu :
$ siege -e 25 -r 25 -i IM http://cakephp.org [...] Transactions: 375 hits Availability: 100.00 % Elapsed time: 37.03 secs Data transferred: 13.52 MB Response time: 0.83 secs Transaction rate: 10.13 trans/sec Throughput: 0.37 MB/sec Concurrency: 8.39 Successful transactions: 375 Failed transactions: 0 Longest transaction: 1.10 Shortest transaction: 0.78
Pour les utilisateurs de XDebug, un autre outil intéressant a été mentionné et complimenté : il s’agit du profiler intégré à XDebug qui permet de générer des rapports sur les points faibles de vos scripts PHP (voir cachegrind et valgrind). Encore un outil vraiment très utile !
Dans tous les cas, lors de l’analyse des résultats obtenus, le point sur lequel Joël Perras a insisté est que c’est une erreur de se baser sur les valeurs moyennes de performances. L’utilisateur ne se rappellera que du temps de chargement de sa page et il faut donc évaluer les performances de son application en se basant sur les pires résultats obtenus.
Vient ensuite le moment tant attendu de l’optimisation ! Après avoir fait tous ces benchmarks vous devez avoir pu déterminer si l’application devait vraiment être optimisée ou non, et à quel niveau. Voici donc les différentes couches sur lesquelles vous pouvez travailler pour améliorer les performances de votre application :
- Requêtes SQL : dans 80% des cas modifier une requête SQL (en utilisant notamment le Containable Behavior) pour l’optimiser vous fera faire un bond énorme dans les performances de votre application. De même il se peut que la modélisation de la base de données soit incorrecte et vous ralentisse, d’où l’intérêt de passer du temps sur la conception de celle-ci.
- Mise en cache : il y a là encore différentes techniques de mise en cache des pages HTML générées
- Mise en cache de la page entière : utiliser l’attribut $cacheAction du contrôleur
- Mise en cache d’éléments
- <cake:nocache> pour mentionner des portions de page qui ne seront pas mises en cache lorsque la page entière est cachée. Ceci a été très fortement déconseillé par Joël, cela sera même supprimé dans les futures versions du framework !
- Cache OpCode : APC avait été présenté en début de conférence, il existe aussi XCache ou encore eAccelerator
- Serveur web : le serveur peut également être amélioré pour gagner de précieuses microsecondes. Lighttpd a été présenté comme un serveur nettement plus performant que Apache, et Nginx a également été mentionné.
- Autres micro-astuce PHP : vérifiez votre include_path afin que le chemin vers Cake soit en premier et qu’il n’y ait pas de chemins inutiles
Pour conclure la conférence un bémol a été émis quand à l’intérêt de vouloir à tout prix optimiser une application : attendez d’en avoir réellement besoin, et focalisez vous sur les parties les plus importantes ! N’oubliez jamais d’optimiser les scripts côté clients car ils sont au moins aussi importants que ceux côté serveur. Pour celà, vous pouvez utilisez les outils de Yahoo! ou Google à votre disposition : YSlow et PageSpeed
Une conférence vraiment très intéressante qui permet de rediriger vers de nombreux outils tous plus utiles les uns que les autres … maintenant, c’est à vous de tester ces outils sur vos applications ! Et n’hésitez pas à donner des retours
Pingback: CakePHP n’est pas mort !