Open SourceChaque propriétaire de boutique en ligne souhaite une boutique en ligne qui fonctionne rapidement et efficacement, et comme vous le savez peut-être, ces facteurs affectent directement les conversions et la satisfaction des clients.

La plate-forme Adobe Magento Open Source utilise un système de mise en cache qui accélère le chargement des pages tout en réduisant la charge du serveur. Magento Open Source met en cache les pages produits, les pages catégories et les pages CMS. Ces pages se ressemblent pour chaque utilisateur qui visite le magasin, et leur contenu, après avoir été généré par le serveur, est stocké en mémoire. De cette façon, les visiteurs suivants reçoivent le contenu précédemment enregistré (le contenu n'est ainsi pas généré systématiquement à chaque fois pour chaque utilisateur).

Les mécanismes de Magento Open Source suppriment automatiquement le cache de la mémoire si le contenu change, par exemple en modifiant le produit ou lorsque le produit est épuisé.

La situation initiale

Les pages de catégories dans Magento Open Source sont parmi les pages les plus visitées. Le cache de ces pages est actualisé chaque fois qu'un produit est épuisé, ce qui signifie que le produit n'est plus affiché ou est marqué comme indisponible.

L'équipe de développement d'Alekseon a remarqué que le cache de catégorie dans Magento Open Source est également actualisé lorsqu'un produit n'est pas visible individuellement, mais ne représente qu'une option de produit configurable (par exemple, la taille). Dans ce cas, le cache de toutes les catégories contenant un produit configurable est vidé, et dans le cas de plusieurs pages, cela n'affecte pas le contenu des pages de catégorie.

En pratique, il s'avère que le cache des pages de catégorie est souvent vidé, ce qui signifie que les clients se retrouvent sur une page de catégorie sans cache construit. Ces pages s'ouvrent plus lentement et entraînent une augmentation de la charge du serveur.

Ce que nous avons changé

Nous avons mis en place un patch qui arrête l'actualisation du cache de catégorie lorsque l'état du stock d'un produit non visible individuellement a changé. Cette solution a sensiblement amélioré les performances et la vitesse de chargement des pages pour nos clients.

Qui en profitera le plus ?

Les bénéficiaires de ce patch sont les magasins qui :

  • utilisent des produits qui ne sont pas affichés individuellement comme options pour les produits configurables
  • ont des catégories avec de nombreux produits (SKU)
  • ont des produits avec une petite quantité de stock
  • ontun trafic élevé et des ventes fréquentes
  • connaissent des ruptures de stock fréquentes

Un "must-snow" avant la mise en œuvre : un effet secondaire du patch

Malheureusement, dans certains cas, notre solution entraîne les conséquences suivantes :

  • la liste des filtres de catégorie peut être obsolète si leurs valeurs dépendent de produits qui ne sont pas visibles individuellement, par exemple, lorsque nous avons un filtre de tailles disponibles. (Cela n'affecte pas le résultat du filtre)
  • si nous affichons des options de produits sur une page de catégorie, elles peuvent être obsolètes. (La fiche produit est alors correcte)

Comment installer le correctif

Notre patch est gratuit et disponible sur GitHub

Une fois installé, vous devez l'activer dans votre configuration Magento :

stores -> Configuration -> Catalog -> Cache -> Refresh the Category Cache only if stock status changed for visible products

Remarques techniques

Nous remplaçons la classe native Magento Open Source par une préférence dans di.xml :

Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner

Notre objectif était de modifier le paramètre $productIds passé à la méthode

getCategoryIdsByProductIds($productIds) w metodzie clean(...):
$productIdsForCategoryCacheClean = $this->getProductIdsForCategoryCacheClean($productStatusesBefore, $productStatusesAfter);
$categoryIds = $this->getCategoryIdsByProductIds($productIdsForCategoryCacheClean);

La classe native CacheCleaner a les méthodes privées suivantes que nous avons dû copier, mais elles ne contiennent aucune de nos modifications :

private function getProductStockStatuses(array $productIds)
private function getProductIdsForCacheClean(array $productStatusesBefore, array $productStatusesAfter)
private function getCategoryIdsByProductIds(array $productIds)
private function getConnection()