Jump to content

[1.6.1.2] Cache, Product-List Et Ps_Smarty_Lazy_Cache


Pati1973

Recommended Posts

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

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

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 :

 

mini_271031tablepssmartylazycache.jpg

Link to comment
Share on other sites

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 by erouvier29 (see edit history)
Link to comment
Share on other sites

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

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

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

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

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

  • 7 months later...

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

  • 4 weeks later...

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

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...