Jump to content

Comportement perturbant du cache smarty


Recommended Posts

Bonjour,

Dans un souci de performance et confort de navigation pour les utilisateurs de mon site j'ai activé le cache smarty de cette façon :

$smarty->caching           = true;
$smarty->force_compile  = false;



Pour être certain de partir d'un cache non corrompu j'ai supprimé le contenu des dossiers suivant en prenant soin de ne pas supprimer les fichiers index.php:
- tools/smarty/cache/
- tools/smarty/compile/

Une fois toutes ces manipulations faites, lorsque je suis dans une catégorie et que je souhaite naviguer vers une autre, l'url du navigateur change bien et le chargement de la page se fait entièrement mais le contenu ne change pas.
En gros le cache est en permanence celui de la première catégorie dans laquelle je me trouve initialement.

J'ai tenté une recherche dans le forum anglais où j'ai trouvé des sujets similaires mais sans réponse ...

Y-a-t-il un moyen pour corriger cela ?
A défaut d'une correction s'il s'agit d'un bug avéré et non résolvable avant une prochaine version, merci de me confirmer ce statut.

Merci d'avance.

Link to comment
Share on other sites

Après une petite recherche dans les fichiers, je ne trouve aucune occurrence de is_cache() ou encore clear_cache() autres que les déclarations dans la classe Smarty.

Je suis débutant et ne cerne pas bien encore le langage ainsi que l'outil, du coup si quelqu'un pouvais m'expliquer de quelle manière est implémenté le cache Smarty, ce serait vraiment magnifique.

Merci d'avance.

Link to comment
Share on other sites

  • 2 weeks later...
  • 4 weeks later...

Merci de ta réponse mais en y regardant un peu, ce module sert à vider le cache smarty.
Hors avant son activation, ce dernier n'avait jamais servi et ne peut donc être corrumpu sauf si le souci se trouve ailleurs.
J'ai correctement vidé les différents éléments, ce que fait ce module visiblement.

Je n'ai en revanche toujours pas trouvé comment avoir un cache correct, ce qui est très embêtant pour un site qui utilise de telles ressources.

Si quelqu'un en sait un peu plus, merci de nous éclairer.

Link to comment
Share on other sites

Merci de ta réponse mais en y regardant un peu, ce module sert à vider le cache smarty.
Hors avant son activation, ce dernier n'avait jamais servi et ne peut donc être corrumpu sauf si le souci se trouve ailleurs.
J'ai correctement vidé les différents éléments, ce que fait ce module visiblement.

Je n'ai en revanche toujours pas trouvé comment avoir un cache correct, ce qui est très embêtant pour un site qui utilise de telles ressources.

Si quelqu'un en sait un peu plus, merci de nous éclairer.

Vous pouvez utiliser le pragma NO CACHE objectif était d'éviter que les fichiers cache header.tpl
Link to comment
Share on other sites

  • 2 weeks later...

Que ce soit dans les produits ou catégorie le cache ne semble tout simplement pas implémenté.
La ligne suivante ne comprend pas de second argument :
$smarty->display(_PS_THEME_DIR_.'product.tpl');

D'après la méthode display le second argument est la clé de cache :
function display($resource_name, $cache_id = null, $compile_id = null)

Je ne comprend donc plus rien, comment peut-il y avoir des posts sur le forum pour demander comment vider le cache si celui-ci n'est même pas implémenté !!

Aurais-je fais une bêtises monumentale et serai passé à côté d'un truc tout simple ?
Peut-on au moins confirmer que la mise en place du cache et son invalidation est effective ?

Il semble pourtant que ce soit le cas quand on regarde le changelog, il y a plusieurs FIX sur ce sujet.

Help please !

Link to comment
Share on other sites

  • 3 months later...

Si quelqu'un a une réponse, je suis également fortement interessé ; j'ai la même impression que toi ; le systeme de cache existe mais ne semble pas implémenté...
N'est-il pas possible de trouver un fichier avec le cache deja tout prêt pour Prestashop ?

Link to comment
Share on other sites

Je suis dans le même cas, des que j'active le cache, ca deviens un peu du n'importe quoi, comment définir ce qu'il faut cacher, combien de temps et etc...
je voudrais cacher tous les menus, pour éviter de refaire les requête SQL, mais il faut bien à un moment définir si on doit relancer la requête ou si on doit utiliser le cache, ca ne sert à rien d utiliser un cache si on fais quand même le traitement ...

Link to comment
Share on other sites

Donc, ça ne peut pas fonctionner car ce n'est pas implémenté pour le moment.

Il faut passer une variable ( id produit : id_catégorie ) pour signaler à smarty que les pages sont différentes.

Pour ceux qui veulent implémenter le cache sur certains modules, ( statique, sinon on aura le même problème, donc un menu c'est ok )
exemple avec le menu de julien Breux, méthode hooktop ( http://www.julien-breux.com/2009/08/25/menu-horizontal-v-1-0/ )

    $lastCachingStatus = $smarty->caching; // on enregistre l'etat ( désactivé dans notre cas )
       $smarty->caching = true; // on active le cache
       if(!$smarty->is_cached(dirname(__FILE__).'/blocktopmenu.tpl')){ // si le cache n est pas valide, on régénère les données, regardez le chemin
               $this->makeMenu();  // requete sql, traitement... qui ne sera pas executé si le cache est valide
               $smarty->assign('MENU_SEARCH', Configuration::get('MOD_BLOCKTOPMENU_SEARCH'));
               $smarty->assign('MENU', $this->_menu; // enregistrement des données dans smarty
               $smarty->assign('this_path', $this->_path);
       }
       $html = $this->display(__FILE__, 'blocktopmenu.tpl'); // on affiche le menu
       $smarty->caching = $lastCachingStatus; // on remet le traitement du cache dans son état d origine
       return $html;        // on renvoi le html



Voila

C'est un exemple, si vous utilisez plusieurs langue, ca ne fonctionnera pas, pareil si votre menu change en fonction des groupes...

Link to comment
Share on other sites

  • 5 weeks later...

Salut à toi !

Merci pour ce début de réponse, c'est deja un peu plus clair ;)

1/ Cependant, j'ai vraiment du mal avec le developpement dans Smarty ; n'y aurait-il pas la possibilité de trouver un cache préconfiguré générique quelque part ? J'imagine que, même si chacun utilise ses propres config et modules, certains morceaux de la page ont toujours tout interet à être mis en cache, non ?

Par exemple, les menus ou le footer par exemple, sont particulierement "cachables" puisqu'ils ne changent pas ou peu ?

Ne serait-il pas possible d'avoir le code d'un cache activé et optimisé pour ces éléments "cachables" pour une boutique prestashop configurée par défaut ?

2/ Dans le même ordre d'idée; comment savoir quels sont les éléments cachables ? Y'a-t-il moyen de trouver une liste quelque part de ce que l'on peut cacher et ce qui ne doit pas l'être ?
Est-il possible de cacher les catalogue, non pas de façon général, mais de les cacher PAR catalogue (le catalogue 1 est caché, le catalogue 2 également, etc...). Si j'ai bien compris on ne peux cacher que les fichier .TPL, or c'est le même .TPL qui est chargé pour tout les catalogues; comment faire alors, si c'est possible ?


3/ Sinon autre question ; dans le code ci dessus, je ne vois pas où cela est configuré, mais quand le cache de ton exemple expire-t-il ?
Pour ma part j'aimerais obtenir un cache actif sur les éléments qui n'ont pas besoin d'être regénérés à chaque fois (menus, footer, que-sait-je encore ^^) qui expirerait au bout de 2H ; tu sais où je pourrais trouver cela ?

Link to comment
Share on other sites

Par defaut temps de cache à une heure ( 3600 secondes )

Pour plus de reglage, voir la doc smarty : http://www.smarty.net/manual/fr/caching.php

dans la doc technique de prestashop, ils expliquent bien que le cache smarty n est pas configuré et ne peut pas fonctionner.
il l'utilisent seuelement en moteur de template.

les éléments cachable sont les tpl qui ont des données identique, par exemple un footer, ou un header ( si il ne contient pas le nom de l utilisateur ou le panier )
c'est à vous de regarder les donées qui sont dedant.

Link to comment
Share on other sites

  • 1 month later...

Je en sais pas si il y en à qui suivent ce post, mais j'ai du rajouter des langues, et du coup, il faut prendre en compte un paramètre.

Lire : http://www.smarty.net/manual/fr/caching.multiple.caches.php

Donc voici le code pour le menu de julien breux : menu horizontal v 1.3

  public function hooktop($param)
 {
       global $smarty, $css_files, $js_files, $jsfoot_files, $cookie;
       $css_files['/min/?f='.$this->_path.'css/superfish-modified.css'] = 'screen';
       //$jsfoot_files[] = $this->_path.'js/hoverIntent.js';
       //$jsfoot_files[] = $this->_path.'js/superfish-modified.js';
       //$jsfoot_files[] = $this->_path.'js/blocktopmenu.js';

       $lastCachingStatus = $smarty->caching;
       $smarty->caching = true;
       $params = Language::getIsoById($cookie->id_lang);
       if(!$smarty->is_cached(dirname(__FILE__).'/blocktopmenu.tpl',$params)){
           $this->makeMenu();
           $smarty->assign('MENU_SEARCH', Configuration::get('MOD_BLOCKTOPMENU_SEARCH'));
           $smarty->assign('MENU', $this->_menu);
           $smarty->assign('this_path', $this->_path);
       }
       $html = $this->display(__FILE__, 'blocktopmenu.tpl',$params);
       $smarty->caching = $lastCachingStatus;
       return $html;
 }



et dans la class Module.php il faut modifier l appel à la class smarty pour qu'il prenen en compte un parametres :

    public static function display($file, $template,$params=null)
   {
       global $smarty;
       $previousTemplate = $smarty->currentTemplate;
       $smarty->currentTemplate = substr(basename($template), 0, -4);
       $smarty->assign('module_dir', __PS_BASE_URI__.'modules/'.basename($file, '.php').'/');
       if (file_exists(_PS_THEME_DIR_.'modules/'.basename($file, '.php').'/'.$template))
       {
           $smarty->assign('module_template_dir', _THEME_DIR_.'modules/'.basename($file, '.php').'/');
           $result = $smarty->fetch(_PS_THEME_DIR_.'modules/'.basename($file, '.php').'/'.$template,$params);
       }
       elseif (file_exists(dirname($file).'/'.$template))
       {
           $smarty->assign('module_template_dir', __PS_BASE_URI__.'modules/'.basename($file, '.php').'/');
           $result = $smarty->fetch(dirname($file).'/'.$template,$params);
       }
       else
           $result = Tools::displayError('No template found');
       $smarty->currentTemplate = $previousTemplate;
       return $result;
   }

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