Jump to content

Lenteur appel page catégorie de produits avec énormément de déclinaisons


Recommended Posts

Bonjour,

J'ai une catégorie mère qui est affichable sur mon site, et celle-ci contient plus de 400 produits qui eux-mêmes ont environ 750 déclinaisons. Dans mes tables ps_product_attribute, ps_product_attribute_combination et ps_product_attribute_shop il y a respectivement environ 330 000, 1 600 000 et 300 000 lignes (qui sont quasiment que pour ces produits).

Lorsque j'appel cette catégorie mère, celle-ci met environ 20 secondes à afficher 12 produits. 

Je suppose que l'affichage de ces produits doit faire appel à une fonction qui va regarder dans les tables listées plus haut, puisqu'il n'y a que elles qui contiennent énormément de données (avec ps_stock_available). Même si il n'y a aucun affichage de ces attributs sur les miniatures des produits dans la page catégorie, je ne vois que les attributs en cause dans cette lenteur.

Quand je fais cette même opération avec des sous-catégories de cette catégorie mère, j'obtiens un délai de chargement beaucoup moins important (moins il y a de produits, plus le chargement est rapide).

Je ne peux pas ne pas afficher cette catégorie mère sur mon site.

Je loue un serveur dédié avec 6 coeurs physiques et 32 GO de RAM sur lequel mon site est déployé (non accessible pour le moment). Lors de l'appel de la catégorie mère ou d'une sous-catégorie, un seul thread est actif à 100% pendant X secondes en fonction du nombre de produits dans la catégorie.

Une fois que la page (categorie-mere?page=x) est chargée, si elle est appellée une nouvelle fois, elle est chargée instantanément avec le cache. Mais j'ai bien l'impression que le nombre de page en cache est limité, puisqu'au bout d'une dizaine de pages misent en cache, les premières redeviennent très lentes à charger.

J'ai tenté quelques configurations sur la configuration de MariaDB, en vain.

Je ne sais pas quoi faire pour que cette lenteur disparaisse. Auriez-vous une idée de quelle configuration dois-je appliquer à ma base de donnée, à mon serveur web (Apache2), quel fichier de prestashop dois-je modifier ?

PS : j'utilise prestashop 1.7.7.5.

Je vous remercie d'avance.

Edited by Raziorky
précision version prestashop (see edit history)
Link to comment
Share on other sites

J'ai regardé du côté du classes/Category.php où à la ligne 1017 j'ai le code suivant

Quote
$sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) AS quantity' . (Combination::isFeatureActive() ? ', IFNULL(product_attribute_shop.id_product_attribute, 0) AS id_product_attribute,
					product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '') . ', pl.`description`, pl.`description_short`, pl.`available_now`,
					pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, image_shop.`id_image` id_image,
					il.`legend` as legend, m.`name` AS manufacturer_name, cl.`name` AS category_default,
					DATEDIFF(product_shop.`date_add`, DATE_SUB("' . date('Y-m-d') . ' 00:00:00",
					INTERVAL ' . (int) $nbDaysNewProduct . ' DAY)) > 0 AS new, product_shop.price AS orderprice
				FROM `' . _DB_PREFIX_ . 'category_product` cp
				LEFT JOIN `' . _DB_PREFIX_ . 'product` p
					ON p.`id_product` = cp.`id_product`
				' . Shop::addSqlAssociation('product', 'p') .
                (Combination::isFeatureActive() ? ' LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute_shop` product_attribute_shop
				ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop=' . (int) $context->shop->id . ')' : '') . '
				' . Product::sqlStock('p', 0) . '
				LEFT JOIN `' . _DB_PREFIX_ . 'category_lang` cl
					ON (product_shop.`id_category_default` = cl.`id_category`
					AND cl.`id_lang` = ' . (int) $idLang . Shop::addSqlRestrictionOnLang('cl') . ')
				LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` pl
					ON (p.`id_product` = pl.`id_product`
					AND pl.`id_lang` = ' . (int) $idLang . Shop::addSqlRestrictionOnLang('pl') . ')
				LEFT JOIN `' . _DB_PREFIX_ . 'image_shop` image_shop
					ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop=' . (int) $context->shop->id . ')
				LEFT JOIN `' . _DB_PREFIX_ . 'image_lang` il
					ON (image_shop.`id_image` = il.`id_image`
					AND il.`id_lang` = ' . (int) $idLang . ')
				LEFT JOIN `' . _DB_PREFIX_ . 'manufacturer` m
					ON m.`id_manufacturer` = p.`id_manufacturer`
				WHERE product_shop.`id_shop` = ' . (int) $context->shop->id . '
					AND cp.`id_category` = ' . (int) $this->id
                    . ($active ? ' AND product_shop.`active` = 1' : '')
                    . ($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '')
                    . ($idSupplier ? ' AND p.id_supplier = ' . (int) $idSupplier : '');

 

Le problème de lenteur lors de l'affichage des catégories devrait venir de là puisque la requête va chercher différentes informations sur les attributs des produits... Je ne suis pas expert en PHP et SQL, et je ne connais pas vraiment l'architecture des fichiers PHP de prestashop, si quelqu'un pouvait me confirmer que c'est bien cette requête qui est à modifier pour résoudre ces latences énormes et aussi que cette requête n'est appelée que pour l'affichage des produits dans une catégorie (je ne voudrais pas casser une autre partie de mon site ^^) et que supprimer la lecture des attributs des produits est sans risque.

D'ailleurs je me demande toujours pourquoi les attributs sont lus lors de l'appel d'une catégorie ???

Merci d'avance !

Link to comment
Share on other sites

Oui en effet, j'ai fais de même hier soir, le tout va beaucoup mieux.

Mais j'ai d'autres soucis avec cette boutique, je n'en suis pas à ma première, mais celle-ci me fait des erreurs pas possible.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...