Raziorky Posted June 28, 2021 Share Posted June 28, 2021 (edited) 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 June 28, 2021 by Raziorky précision version prestashop (see edit history) Link to comment Share on other sites More sharing options...
Raziorky Posted June 30, 2021 Author Share Posted June 30, 2021 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 More sharing options...
Raziorky Posted July 7, 2021 Author Share Posted July 7, 2021 Bonjour, J'ai résolu mon problème en augmentant query_cache_limit et query_cache_size dans le fichier de configuration de la base de donnée. Link to comment Share on other sites More sharing options...
Fly Posted July 9, 2021 Share Posted July 9, 2021 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now