pppplus Posted September 18, 2019 Share Posted September 18, 2019 Je suis en train de supprimer des produits de ma boutique, et c'est d'une lenteur abominable ! J'ai 7000 produits environ, et en supprimer 1 prend des plombes. PS 1.7.6.1 Je viens de regarder ce qui ralentit : Quand on supprime un article, tous les articles de la catégories sont impactés (reclassés) OK, normal, pas de problème. Ensuite, tous les produits sont mis à jour 1 par 1, juste pour date_upd, dans la fonction cleanPositions (du fichier /classes/Product) : /** * Reorder product position in category $id_category. * Call it after deleting a product from a category. * * @param int $id_category */ public static function cleanPositions($id_category, $position = 0) { $return = true; if (!(int) $position) { $result = Db::getInstance()->executeS(' SELECT `id_product` FROM `' . _DB_PREFIX_ . 'category_product` WHERE `id_category` = ' . (int) $id_category . ' ORDER BY `position` '); $total = count($result); for ($i = 0; $i < $total; ++$i) { $return &= Db::getInstance()->update( 'category_product', array('position' => $i), '`id_category` = ' . (int) $id_category . ' AND `id_product` = ' . (int) $result[$i]['id_product'] ); /*$return &= Db::getInstance()->execute( 'UPDATE `' . _DB_PREFIX_ . 'product` p' . Shop::addSqlAssociation('product', 'p') . ' SET p.`date_upd` = "' . date('Y-m-d H:i:s') . '", product_shop.`date_upd` = "' . date('Y-m-d H:i:s') . '" WHERE p.`id_product` = ' . (int) $result[$i]['id_product'] );*/ } } else { $result = Db::getInstance()->executeS(' SELECT `id_product` FROM `' . _DB_PREFIX_ . 'category_product` WHERE `id_category` = ' . (int) $id_category . ' AND `position` > ' . (int) $position . ' ORDER BY `position` '); $total = count($result); $return &= Db::getInstance()->update( 'category_product', array('position' => array('type' => 'sql', 'value' => '`position`-1')), '`id_category` = ' . (int) $id_category . ' AND `position` > ' . (int) $position ); /*for ($i = 0; $i < $total; ++$i) { $return &= Db::getInstance()->execute( 'UPDATE `' . _DB_PREFIX_ . 'product` p' . Shop::addSqlAssociation('product', 'p') . ' SET p.`date_upd` = "' . date('Y-m-d H:i:s') . '", product_shop.`date_upd` = "' . date('Y-m-d H:i:s') . '" WHERE p.`id_product` = ' . (int) $result[$i]['id_product'] ); }*/ } return $return; } C'est totalement insensé !! En gros, pour une suppression d'un produit, qui est dans 4 catégories différentes, on va : - mettre à jour 1 champ de 2 tables pour chaque produit de 4 catégories différentes. Si j'ai 1000 produits par catégories, on va faire 4000 requêtes !!! J'ai commenté ces lignes (à 2 endroits dans la fonction, et maintenant, il faut à peu près 1 seconde pour supprimer 1 produit. Contre plusieurs minutes par produit précédemment. Alors, est-ce que cette mise à jour de date est vraiment pertinente (le produit en lui-même n'est pas modifié en plus !!) et si c'est vraiment pertinent, il faut impérativement modifier la requête, pour qu'elle mette à jour tous les produits en 1 fois. Moi, je suis pour la supprimer totalement, je ne vois pas l'intérêt de modifier la date de mise à jour d'un produit, qui n'a que changé de position !! Difficile d'envoyer ça comme un bug... quoique ! Link to comment Share on other sites More sharing options...
David-Julian Buch Posted September 18, 2019 Share Posted September 18, 2019 Bonjour, ce qui est surtout insensé est de faire une requête de mise à jour par produit. On pourrait très bien remplir un tableau avec les ids des produits à mettre à jour et ensuite executer une seule requête pour mettre à jour la date avec une condition WHERE p.id_product in ('.implode(',', $ids).') Link to comment Share on other sites More sharing options...
Eolia Posted September 18, 2019 Share Posted September 18, 2019 J'ai donné la solution il y a quelques temps ici mais Prestashop l'a laissé dans les oubliettes semble-t-il... https://github.com/PrestaShop/PrestaShop/issues/12907 Link to comment Share on other sites More sharing options...
pppplus Posted September 18, 2019 Author Share Posted September 18, 2019 Oui @David-Julian Buch c'est à minima ce qu'il faut faire. @Eolia : dommage, je n'ai pas trouvé votre suggestion, du coup, j'ai passé un peu de temps à trouver cette satanée requête ! J'ai commenté votre post ! Ca fera peut-être avancer le schmilblick ! Link to comment Share on other sites More sharing options...
Eolia Posted September 18, 2019 Share Posted September 18, 2019 C'est beau l'espoir Link to comment Share on other sites More sharing options...
Asu34 Posted June 22, 2021 Share Posted June 22, 2021 Bonjour à tous, Je me permets "réouvrir" ce topic, je suis sous un PS 1.7.6.7 et subit ce problème de lenteur lorsque je souhaite supprimer plusieurs produits... (+/- 1 min / produits). Existe t-il a ce jour une solution ? Merci Link to comment Share on other sites More sharing options...
pppplus Posted June 22, 2021 Author Share Posted June 22, 2021 Non, ce problème est toujours présent. Il faut éditer le fichier PHP, comme expliqué plus haut. Link to comment Share on other sites More sharing options...
Asu34 Posted June 22, 2021 Share Posted June 22, 2021 Merci pour votre réponse. Donc l'idée serait remplacer ces 2 conditions : WHERE p.`id_product` = ' . (int) $result[$i]['id_product'] par WHERE p.id_product in ('.implode(',', $ids).') C'est bien ça ? Link to comment Share on other sites More sharing options...
pppplus Posted June 22, 2021 Author Share Posted June 22, 2021 (edited) Non, ça c'est la solution idéale, mais ça demande plus de modifications du fonctionnement global de suppression produits. La solution, est dans le tout premier post (désactivation de la boucle de reclassement for en fin de fonction) J'ai mis le code intégral, il n'a pas changé (ou très peu) dans la 1.7 Je l'utilise toujours quand je dois supprimer beaucoup de produits. Edited June 22, 2021 by pppplus (see edit history) Link to comment Share on other sites More sharing options...
Asu34 Posted June 22, 2021 Share Posted June 22, 2021 D'accord, donc en gros je commente la dernière boucle de la function cleanPositions de product.php c'est bien ça ? Et je la "réactive" dès la suppression massive de mes produits effectués ? Merci encore Link to comment Share on other sites More sharing options...
pppplus Posted June 22, 2021 Author Share Posted June 22, 2021 Oui, c'est ça 1 Link to comment Share on other sites More sharing options...
Blawdi Posted June 3, 2022 Share Posted June 3, 2022 Bonjour, on a le même soucis via le webservice. du coup quand vous dite "Je l'utilise toujours quand je dois supprimer beaucoup de produits." cela veut dire qu'il faut retirer cette modification lorsqu'on ne doit pas supprimer de produits ? Link to comment Share on other sites More sharing options...
pppplus Posted June 3, 2022 Author Share Posted June 3, 2022 Oui, c'est utile pour reclasser les positions dans la/les catégories 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