Pati1973 Posted January 4, 2016 Share Posted January 4, 2016 Bonjour, cela va faire trois semaines que je bloque sur un problème qui semble bien être un bug. Lorsque j'active le cache sur ma boutique 1.6.1.2, l'affichage de la liste des produits dans une catégorie est très longue. En fait, c'est un peu plus complexe. Lorsque je clique pour la première fois, ça va être inhabituellement long. La deuxième fois également. Mais la troisième fois (desfois la quatrième fois), cela va être carrément plus rapide (le cache a bien l'air de fonctionner à ce moment là).Mais si je repars sur une autre catégorie, et que je reviens quelques minutes plus tard, l'affichage redevient long ! Par contre, si je désactive le cache, l'affichage des catégorie est TOUJOURS rapide. Quelle différence entre les deux cas ? En activant le PROFILING DEBUG, je remarque que lorsque le cache est activé, il y a de longues "transactions SQL" sur la table ps_smarty_lazy_cache Par contre, l'affichage des pages produits est très rapide, avec le cache activé. Et aucune transaction sur cette table ps_smarty_lazy_cache n'existe. Voici un exemple de transaction : DELETE FROM `ps_smarty_lazy_cache`WHERE template_hash='071e1244c7ce83806f542dda1c839f6c' AND cache_id LIKE "productlist_colors|58|1|2%" J'en ai entre 20 à 40 transactions de ce type, voire plus par affichage de catégorie.Et chacune d'elle prend entre 40 ms et 70 ms. Ce qui ralentit alors énormément l'affichage de la page catégorie (surtout si il y a plus de 20 produits)... Qui pourrait m'expliquer à quoi sert la table ps_smarty_lazy_cache Je n'utilise aucun attribut de couleurs.Donc à quoi correspond productlist_colors ?! Peut-on désactiver le cache uniquement sur la page product-list ? Link to comment Share on other sites More sharing options...
erouvier29 Posted January 5, 2016 Share Posted January 5, 2016 Bonjour, Je ne sais pas exactement comment marche le cache, mais les DELETE from ps_smarty_lazy_cache sont déclenchés depuis SmartyCustom.php, à la ligne 222: // If the filepath is not yet set, it means the cache update is in progress in another process. // In this case do not try to clear the cache again and tell to use the existing cache, if any if ($result !== false && $result['filepath'] == '') { // If the cache update is stalled for more than 1min, something should be wrong, // remove the entry from the lazy cache if ($result['last_update'] < time() - 60) { $this->delete_from_lazy_cache($template, $cache_id, $compile_id); } Une piste serait un problème d'écriture dans le répertoire /cache/smarty/cache/productlist_colors Cordialement Link to comment Share on other sites More sharing options...
erouvier29 Posted January 5, 2016 Share Posted January 5, 2016 Après avoir chargé une page de catégorie, quel est le contenu de la table ps_smarty_lazy_cache (cache_id LIKE "productlist_colors%") ? Link to comment Share on other sites More sharing options...
Pati1973 Posted January 5, 2016 Author Share Posted January 5, 2016 Hello, j'ai des DELETE mais aussi des INSERT IGNORE comme : INSERT IGNORE INTO `ps_smarty_lazy_cache` (`template_hash`, `cache_id`, `compile_id`, `last_update`) VALUES ('071e1244c7ce83806f542dda1c839f6c',"productlist_colors|6517|1|2","", FROM_UNIXTIME(1451985659)) Le plus étrange, c'est que l'attribut couleur n'est pas utilisée sur ces pages de catégories (voir même très peu utilisé sur tout le catalogue). J'ai effectué un test en supprimant l'attribut couleur également. Voici un exemple du conteneu de la table : Link to comment Share on other sites More sharing options...
erouvier29 Posted January 5, 2016 Share Posted January 5, 2016 (edited) 1. Oubliez cette histoire de couleur, c'est le nom du cache qui est comme ça, même si vous n'utilisez aucun attribut de type couleur 2. Si vous rechargez plusieurs fois la même page de catégorie, vous avez alternativement des requêtes DELETE et des requêtes INSERT IGNORE: c'est conforme (j'allais dire c'est normal...) à la mécanique de cache. Il reste simplement à comprendre pourquoi la colonne filepath reste vide. Le dossier /cache/smarty/cache/productlist_colors existe-t-il et contient-il quelque chose? Edited January 5, 2016 by erouvier29 (see edit history) Link to comment Share on other sites More sharing options...
Pati1973 Posted January 5, 2016 Author Share Posted January 5, 2016 J'ai fais le test sur 4 sites différents. Avec ou sans le thème d'origine. La colonne filepath est toujours vide. De plus, le répertoire productlist_colors n'existe pas. Pour les autres modules en cache, tout fonctionne (block rss, block category, topmenu, etc.) et leur filepath est bien assigné. Link to comment Share on other sites More sharing options...
Pati1973 Posted January 5, 2016 Author Share Posted January 5, 2016 Y a t-il possibilité de désactiver le cache uniquement l'affichage des catégories ? Link to comment Share on other sites More sharing options...
erouvier29 Posted January 5, 2016 Share Posted January 5, 2016 Oui, en modifiant deux lignes dans /classes/SmartyCustom.php: ligne 119 if ($this->caching && basename($template) != 'product-list-colors.tpl') { ligne 312 if ($this->smarty->caching && basename($template) != 'product-list-colors.tpl') { Mais ne dites pas que c'est moi qui vous ai dit de faire ça, j'ai honte! Il faudrait quand même comprendre pourquoi ça bloque spécifiquement avec ce template sur vos sites. Je n'arrive pas à reproduire "naturellement" sur une installation 1.6.1.2 toute fraîche de ce matin. Avez-vous activé le mode DEV? N'avez-vous aucun message d'erreur ou d'alerte sur vos pages catégories? Link to comment Share on other sites More sharing options...
Pati1973 Posted January 5, 2016 Author Share Posted January 5, 2016 Merci pour la réponse. Je testerai ça demain matin. Même avec le template d'origine, sur une petite boutique, j'ai ce même problème. J'ai bien activé le mode DEV. Aucun message d'erreur ni aucune alerte. Link to comment Share on other sites More sharing options...
Pati1973 Posted January 5, 2016 Author Share Posted January 5, 2016 Je n'ai pas trouvé les lignes de code dont vous faîtes références. Par contre, j'ai commenté les lignes suivantes dans classes/controllers/FrontController : ligne 1635 public function addColorsToProductList(&$products) { /*if (!is_array($products) || !count($products) || !file_exists(_PS_THEME_DIR_.'product-list-colors.tpl')) { return; } $products_need_cache = array(); foreach ($products as &$product) { if (!$this->isCached(_PS_THEME_DIR_.'product-list-colors.tpl', $this->getColorsListCacheId($product['id_product']))) { $products_need_cache[] = (int)$product['id_product']; } } unset($product); $colors = false; if (count($products_need_cache)) { $colors = Product::getAttributesColorList($products_need_cache); } Tools::enableCache(); foreach ($products as &$product) { $tpl = $this->context->smarty->createTemplate(_PS_THEME_DIR_.'product-list-colors.tpl', $this->getColorsListCacheId($product['id_product'])); if (isset($colors[$product['id_product']])) { $tpl->assign(array( 'id_product' => $product['id_product'], 'colors_list' => $colors[$product['id_product']], 'link' => Context::getContext()->link, 'img_col_dir' => _THEME_COL_DIR_, 'col_img_dir' => _PS_COL_IMG_DIR_ )); } if (!in_array($product['id_product'], $products_need_cache) || isset($colors[$product['id_product']])) { $product['color_list'] = $tpl->fetch(_PS_THEME_DIR_.'product-list-colors.tpl', $this->getColorsListCacheId($product['id_product'])); } else { $product['color_list'] = ''; } } Tools::restoreCacheSettings();*/ } Et là, par contre, vitesse de chargement excellente. Cela résout le problème je pense, mais par contre, d'où vient cette erreur ? bug de prestashop ou sur mon serveur ? Il faudrait essayer de le reproduire sur un autre serveur ou site. J'ai testé sur 4 sites différents sur le même serveur, avec le template d'origine et template modifié. Link to comment Share on other sites More sharing options...
erouvier29 Posted January 6, 2016 Share Posted January 6, 2016 Bien vu, et content que ça marche. Vous avez donc complètement supprimé l'affichage du bloc couleurs disponibles. J'avais cherché une solution de l'autre côté... Et effectivement, il faudrait investiguer un peu plus pour voir si le problème se reproduit. Link to comment Share on other sites More sharing options...
erouvier29 Posted January 6, 2016 Share Posted January 6, 2016 OK, reproduit de manière systématique avec des produits sans couleur. Hier je m'étais contenté du catalogue de démo... Pour les produits sans couleur, le bloc couleurs était déclaré dans le cache, mais jamais réellement produit. D'où la suppression et la ré-insertion à chaque rechargement de la page catégorie. Une correction possible: https://github.com/PrestaShop/PrestaShop/pull/4649 Link to comment Share on other sites More sharing options...
Pati1973 Posted January 6, 2016 Author Share Posted January 6, 2016 Pour l'instant, je vais laisser tel quel. J'avais ouvert un incident sur la forge de prestashop. http://forge.prestashop.com/browse/PSCSX-7531 En commentant cette partie du code, tous mes sites fonctionnent à merveille. Pour des produits avec, ou sans attributs couleurs. Link to comment Share on other sites More sharing options...
erouvier29 Posted January 6, 2016 Share Posted January 6, 2016 Parfait, j'ai relié tout ça (forum, forge, github) Bonne continuation Link to comment Share on other sites More sharing options...
LauraPresta Posted September 5, 2016 Share Posted September 5, 2016 Vous-êtes sur quelle version de prestashop ? Ici je bosse sur un 1.6.1.6 et le problème est toujours présent Link to comment Share on other sites More sharing options...
erouvier29 Posted September 5, 2016 Share Posted September 5, 2016 Le patch est taggé "amélioration" et pas encore mergé. Vous pouvez l'appliquer vous-même, sous la forme d'un override par exemple. 1 Link to comment Share on other sites More sharing options...
LauraPresta Posted September 6, 2016 Share Posted September 6, 2016 Merci erouvier29. Par contre je n'ai pas bien compris de quel patch tu parlais, mettre en commentaire le contenu de la fonction addColorsToProductList ? Dans ce cas on a plus les couleurs c'est dommage. Link to comment Share on other sites More sharing options...
LauraPresta Posted September 6, 2016 Share Posted September 6, 2016 j'ai utilisé cette solution et pour le moment tout semble bon : Maybe it is to late for Tamara, but for people who end up here in the future:The hotfix Step by Step: - open the FrontController.php in a text-editor (this file is located at .../classes/controller)- find following code: foreach ($products as &$product) {if (!$this->isCached(PS_THEME_DIR.'product-list-colors.tpl', $this->getColorsListCacheId($product['id_product']))){ $products_need_cache[] = (int)$product['id_product']; }}} - comment out the if-clause (add two slashes // in front of the 'if' and in front of the } that closes the if-clause) foreach ($products as &$product) {// if (!$this->isCached(PS_THEME_DIR.'product-list-colors.tpl', $this->getColorsListCacheId($product['id_product']))){ $products_need_cache[] = (int)$product['id_product']; }// }} - upload the FrontController.php - clear cache I had the same issue and I think this fixed it indeed. I guess I'll know in a few hours. Link to comment Share on other sites More sharing options...
erouvier29 Posted September 6, 2016 Share Posted September 6, 2016 Je parlais de ça: https://github.com/PrestaShop/PrestaShop/pull/4649/files Mais l'autre patch est peut-être tout aussi bien, sinon mieux. 1 Link to comment Share on other sites More sharing options...
jd440 Posted September 29, 2016 Share Posted September 29, 2016 Je parlais de ça: https://github.com/PrestaShop/PrestaShop/pull/4649/files Mais l'autre patch est peut-être tout aussi bien, sinon mieux. De quel autre patch parlez vous? Celui de laurapresta? Sinon sur les boutiques n'utilisant jamais les product-list-color il y a aussi la soluce de renommer le fichier du thème if (!is_array($products) || !count($products) || !file_exists(_PS_THEME_DIR_ . 'product-list-colors.tpl')) { return; } Link to comment Share on other sites More sharing options...
erouvier29 Posted September 29, 2016 Share Posted September 29, 2016 De quel autre patch parlez vous? Celui de laurapresta? Oui 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