Ce bout de code permet d’exploiter la puissance du gestionnaire de base de données : pour chaque requête, je lui demande de m’expliquer comment il va la traiter. Cela permet de voir en un coup d’œil si la requête est optimisée, et si des améliorations peuvent être apportées à ce niveau.
Les connaisseurs noteront que je n’utilise pas l’objet MySqL proposé par Wordpress : je vais au plus simple, pour limiter au maximum les risques d’erreur, qui pourraient provoquer des jugements trop hâtifs.
Je suis plutôt content à ce niveau, toutes les requêtes sont relativement optimisées. Revers de la médaille, cela veut également dire que j’allègerai relativement peu la bête en cherchant de ce côté. Flûte.
Prochaine opération, les timers. Modifier le code en plaçant des témoins à différents endroits stratégiques permet de repérer facilement les goulots d’engorgement, pour cibler les zones à optimiser en priorité. Pour cela, on démarre le chrono au tout début du fichier :
{{< highlight bash >}}define("TIMER_START", microtime(true));{{< /highlight >}}puis on affiche le temps écoulés depuis le début à plusieurs reprises :
{{< highlight bash >}}echo microtime(true) – TIMER_START;{{< /highlight >}}Bingo, deux goulots repérés. Sur un total de 430 millisecondes en moyenne pour charger la page (c’est énorme : à titre de comparaison, Blogonet affiche la Home en moins de 30 millisecondes, sur la même bécane) :
- 100 ms sont utilisées par le chargement d’une 15ène de fichiers, définissant des centaines de fonctions, sur plusieurs dizaines de milliers de lignes. Peu de solutions à proposer à ce niveau (ou du moins, pas au niveau du code en lui-même, il faudra plutôt toucher à configuration du serveur, en mettant en place un cache OP-Code).
- 200 ms environ sont utilisées par le moteur de langage : après avoir analysé la chose, la solution est très puissante, mais également très très lourde. Pour corriger le tir, un fichier de cache peut être mis en place sur l’objet ainsi généré.
Résultat, en appliquant les quelques conseils de l’article, j’arrive à franchir la barre des 180 ms, en moyenne. Le tout avec moitié-moins de requêtes. C’est encore beaucoup, j’en suis conscient, mais ça permet déjà de diviser les ressources consommées par deux (et donc de prendre un serveur deux fois moins cher ?).
Bien entendu, ça ne remplacera jamais un système de cache évolué. D’ailleurs, un jour, je regarderai ce qu’ils ont dans le ventre, eux aussi. Il y a peut être moyen d’optimiser encore.
Vos réflexions
Sinon pour carrément soulager le serveur le bon vieux WP-SuperCache, mais je n'aime pas trop car des fois on crée des décalages avec les commentaires...
A bientôt
Cela dit, couplé avec un bon cache, ça peut vraiment être performant. Car oui, il ne faut pas se leurer, à chaque modification (ajout de commentaire, correction mineur...), l'ensemble du cache doit être mis à jour... ce qui entraine forcément de lourds calculs ! Et si tous ces calculs sont nettement allégés, c'est que du bonheur.
Merci beaucoup pour cette expertise (gratuite, qui plus est !) en tout cas !
Concernant WP-Super-Cache, il doit avoir moyen de corriger ces problèmes avec les commentaires. Les seuls problèmes que je vois actuellement sont les différences qu'il peut y avoir entre deux personnes (par exemple, les formulaires pré-remplis, ou les même les commentaires en attente de validation visibles par leur auteur uniquement, etc...). Bref, c'est loin d'être évident.
C'est pour ça que j'aurais aimé avoir l'avis de d'autres connaisseurs, avoir d'autres expertises, pour optimiser la chose au mieux.
Cependant, j'aurais aimé avoir d'autres avis, d'autres expertises, de personnes ayant plongé dans le code, ayant cherché à optimiser la bête. Cela permettrait sûrement d'être encore plus efficace, ou de voir les problèmes (ou cas limites) que peuvent entrainer certaines solutions. Donc si vous avez plongé dans la marmite, ou si vous connaissez des personnes qui l'ont fait, n'hésitez pas à relayer :)
J'ai eu une demi-douzaine de contacts par email, mais j'aurais autant aimé que ces échanges se fassent ici-même, à travers les commentaires, afin qu'un maximum de personnes puissent s'y impliquer. Non ?
Alors, quelles sont vos méthodes pour optimiser la bête ?