Un cycliste s'éclate contre un poteau signalétique
Accueil » Tous les articles » Magento 2 » Comment réduire efficacement les performances de Magento 2 grâce au backend ?

Comment réduire efficacement les performances de Magento 2 grâce au backend ?

Voici la suite de la série d’articles concernant la réduction des performances dans Magento 2. Parce que des performances exécrables passent par un TTFB (Time To First Byte – Temps avant le premier octet) élevé, il est nécessaire d’avoir un code PHP des plus lents. Merci aux personnes qui ont apporté des éléments auxquels je n’avais pas pensé et qui sont dans cet article.

Malheureusement, si vous activez le cache, une partie de vos efforts pour réduire les performances côté back ne seront visibles que dans le tunnel de commande et le compte client. Cela dit, il vaut mieux essayer car le tunnel de commande rester la pierre angulaire de votre application. Sans commande, pas de succès !

Réduire les performances dès l’installation

Magento arrive avec un bon nombre de modules qui permettent de s’adapter à un maximum de situations générales. Du headless au gestionnaire de relation client, l’ensemble des outils est fourni de base. Oubliez qu’un module est un sous-ensemble dans son acceptation contemporaine et considérez Magento 2 comme un bloc. Ne désactivez aucun module, c’est une perte de temps de vérifier si chaque module est utilisé par votre installation.

De même, il est important d’installer un maximum de modules tiers pour n’utiliser qu’une infime partie d’entre eux. Les plus intéressants étant ceux qui n’ont pas été testé avec votre version de Magento 2 ou avec une compatibilité partielle. De même, composer fournit la possibilité d’ignorer les prérequis de votre environnement, c’est peut-être une occasion de faire une bonne blague aux autres devs.

Augmentez la complexité de toutes vos fonctions

Cette astuce est également valable pour la partie PHP. Une fonction de tri de tableau qui s’exécute dans un foreach est déjà un bon début. Mais n’hésitez pas à parcourir à nouveau le tableau pour exécuter un bon preg_replace parce que le marketing vous a demandé de mettre certains mots en gras.

Il peut être également intéressant lors d’un import de produits de ne pas stocker des entiers correspondants à des chaînes de caractères (par exemple des hashtags). Faites la concaténation des chaînes durant l’import produit afin de vous assurez que l’import ne puisse pas se faire en moins de 4h. Pour mettre toutes les chances de votre côté, ne faites surtout pas de mapping des concaténation déjà effectuées.

Multipliez les plugins ou les observers

Pour les plugins, il est naturellement conseillé de préférer les intercepteurs qui s’exécutent autour de la fonction. Le but étant qu’ils s’exécutent un maximum de fois, préférez les méthodes les plus utilisés des classes les plus génériques. Par exemple, fetchView de la classe Template. Les plus audacieux choisiront des méthodes insert ou fetchAssoc de l’adaptateur de base de données. N’oubliez pas d’injecter un maximum de dépendances surtout des biens lourdes comme la session utilisateurs. Ici aussi, la complexité du code permet de perdre de précieux 1/10èmes de secondes.

Ce qui est vrai pour les plugins l’est aussi pour les observers. Les bonnes pratiques que vous avez mises en place pour les plugins ne doivent pas être laissées de côté pour les observers. Cela n’a pas été dit pour les plugins mais dans un cas comme l’autre, n’hésitez pas à mettre des plugins et des observers dans le même module que le code modifié. C’est toujours une belle surprise pour le développeur qui passe ensuite.

Enfin, vos plugins comme vos observers doivent porter sur le scope le plus large. Les sous-dossiers dans le « etc » de votre module sont vos ennemis. Ca fait un clic supplémentaire chaque fois pour ouvrir le sous-dossier et vous avez clairement autre chose à faire que des clics. En plus, on ne sait jamais, ça pourrait être utile dans le futur dans un autre scope.

N’hésitez pas à demander de l’aide

Attention, je ne parle pas d’aide extérieure. Je parle de ce doux concept qui s’appelle Helper. Dans Magento 1, ils étaient légions car hérités du regretté Zend Framework 1. Il n’est pas question d’arrêter cette tradition séculaire. Je n’exagère pas, ce concept existait déjà au millénaire précédent…

Les helpers, pour être efficaces, doivent étendre la classe AbstractHelper. Cela permet de remplacer n’importe quel modèle de vue et décroître les performances de votre installation. Vos helpers doivent être des classes fourre-tout. Ne divisez surtout pas vos vieux helpers hérités de Magento 1 en des services plus petits. C’est une perte de temps qui pourrait être utilisé à complexifier vos fonctions. L’ajout de nouvelles fonctions à un helper qui fait plusieurs centaines de ligne doit être votre but.

Préférez le réel au virtuel

Les classes virtuelles et tout ça, voilà une chose qui accélère les développements et les performances. Dans votre recherche de lenteur absolue, il faut vous tenir éloigné de ces concepts :

  • la procuration virtuelle (proxy) : ce concept permet de déléguer la création d’un objet lourd au moment où il est nécessaire. Autant vous dire que ce n’est pas le but. Ne consultez pas cet article sur les proxies dans Magento 2. On appelle ça du lazy-loading et comme précisé dans le premier article, vous ne voulez pas passer pour un fainéant.
  • les fabriques (factory) : dans Magento 2, le concept est assez proche de la procuration virtuelle. Une classe est créée pour permettre d’en instancier une autre. La création peut être faite à la volée avec le suffixe factory par Magento pour les fabriques simples. Le but est de permettre l’instanciation avec des données non disponible ou dans le cas où l’instanciation est un processus complexe.
  • les classes virtuelles : il n’est pas vraiment question de performances mais de complexité du code. Depuis votre plus tendre enfance, vous aimez les spaghetti et ce n’est pas près de changer.

Les requêtes à la base de données

Un nombre élevé de requêtes à la base de données permet de faire perdre un maximum de temps. Le summum du raffinement est de lancer un load dans une boucle parcourant une grande collection de produits. Ceux qui ont l’âme joueuse peuvent même se permettre de faire ce chargement dans une boucle de produits où ils auront chargé tous les attributs – setAttributeToSelect(‘*’). On n’est jamais trop prudent. Dans vos fonctions sur mesure, il est important d’oublier l’usage du cache. Après tout, la collection est sensée être mise en cache par Magento, non ?

L’important est le travail d’équipe. Dans l’article sur les performances du frontend dans Magento 2, j’expliquais qu’il n’y avait rien de mieux qu’une boucle pour récupérer des produits avec un appel ajax dans la boucle. Vous aurez à coder la contrepartie. Si cela vous paraît absurde, n’en dîtes rien. Les frictions au travail font perdre de l’espérance de vie, ne gâchez pas quelques heures de votre hypothétique retraite à cause d’une querelle.

Soyez sincère, ne cachez rien

Le cache-cache est un jeu pour les enfants et les gens qui ont quelque chose à cacher ne sont bienvenus nulle part. Restez aussi loin que vous pouvez du cache. Vous faites une requête un peu complexe à la base de données dont le résultat ne change que tous les trois mois ? Ne mettez surtout pas en cache. Cela prend du temps à coder et n’apporte pas grand chose. Il n’y a aucun moyen d’être sûr que la sérialisation et la dé-sérialisation des données ne prend pas plus de temps que la requête à la base de données. Si on ajoute à cela le temps d’écriture dans redis, on est sans doute même beaucoup plus haut.

Soyez responsable, assumez vos choix

Certains pourraient vous trouver borné ou têtu. Laissez-les dire. Vous savez au fond de vous que la seule chose qui guide vos pas est la responsabilité envers vos choix. Vous savez pertinemment que ce code produit il y a cinq ans, au réveil de la longue nuit de trois heures que vous avez laissé vos potes alcoolisés ou votre nouveau-né, c’est de la m**de. Si vous vous abaissez à revenir dessus, vos pairs n’hésiterons pas à contester d’autres choix. Ce n’est pas votre but. Les performances ou l’intégrité de votre œuvre, vous avez, là aussi, fait votre choix.

Merci aux intégrateurs et aux développeurs qui ont lu jusqu’ici. Rassurez-vous, la prochaine fois, je taperai sur la gestion de projet.

Besoin d’aide pour mettre cela en place ?


Publié

dans

, ,

par

Commentaires

Laisser un commentaire