Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjours,
dans le souci d'améliorer les performances de mon site, j'essai de mettre en cache les plus grosses requêtes et justement ce sont celles que je pagine.
Le problème c'est que, quand j'essai d'accéder à ma page quand la requête a été mise en cache, j'ai une erreur disant que je passe pas un objet SELECT.
J'avais lu qu'il y avait des histoires de sérialisation, désérialisation avec le Zend_Cache, est-ce que sa en ferait parti?
Merci bien ^^
Hors ligne
Si je comprends bien, tu essayes de mettre le résultat de ton select en cache ? Si c'est ça, tu dois surement avoir un problème de dé-sérialization en effet. Quand tu récupère ton cache, tu ne dois pas avoir ton objet sous sa forme d'origine.
Moi par habitude, je met plutôt en cache les rendus ( donc de l'HTML ).
C'est vrai qu'avec ton code on pourrait t'aider plus facilement.
Hors ligne
oki, je pouvais pas l'envoyer hier soir. Pas sur le bon pc.
Voici le code et effectivement il s'agit bien de l'objet select que je met directement en cache:
$listenews = App_Cache::get('newssite'); if(!$listenews) { $tablenews = new News_Models_Tables_News(); $listenews = $tablenews->fetchAll(null, 'date_news DESC'); App_Cache::set($listenews, 'newssite'); } $page = Zend_Paginator::factory($listenews); $page->setPageRange(7); $page->setCurrentPageNumber($this->_getParam('page', 1)); $page->setItemCountPerPage($this->_getParam('par', 10)); $this->view->news = $page;
Hors ligne
je relance le sujet en espérant que quelqu'un veuille bien répondre
Hors ligne
Hello,
Et si tu remplaces
$listenews = $tablenews->fetchAll(null, 'date_news DESC');
par
$listenews = $tablenews->fetchAll(null, 'date_news DESC')->toArray();
A+
Hors ligne
A mon avis, tu optimises à l'envers...
Ce qui prend du temps, lors d'une requête SQL, c'est pas son exécution, car MySQL par exemple dispose d'un cache performant. Donc si tu passes 2x la même requête, la deuxième fois, tu obtiendras tes informations instantanément ou presque.
Ce qui prend du temps, c'est le transfert des données entre le serveur web et le serveur DB et le traitement et l'affichage des données. Donc ton cache sert uniquement à éviter le transport des données et l'exécution de la requête (qui ne consomme rien).
Dans ton code, les pertes de performances sont plutôt sur la manière dont tu passes ta requête. Tu récupères toutes les données de ta table pour en utiliser que 10. Imagines que ta table contient 1 million de lignes, c'est catastrophique, sans compter que tu affiches peut être que quelques colonnes alors que tu les récupères toutes.
Et peut être le traitement de ces lignes est à optimiser car l'utilisation des getter et setter des objets Zend est très peu performant.
Bref, à mon avis, avant d'utiliser un cache, tu as encore un peu de travail à faire sur le code.
Pour ce faire, tu crées une requête SELECT (Zend_Db_Table_Select je crois) et tu la passes directement dans le paginator qui lui se fera un plaisir d'y ajouter des "LIMIT x,y" AVANT de l'exécuter. Donc au final, tu récupèreras que les données dont tu as besoin. Egalement, tu spécifies dans ta requête SELECT les colonnes dont tu as besoin afin de ne pas récupérer de données inutiles.
Après ça, je suis sûr que tu n'auras plus besoin de cache sur ta requête mais comme dit plus haut, plutôt sur l'affichage.
Dernière modification par keilnoth (14-08-2009 10:28:01)
Hors ligne
j'ai mis ceci en pratique et on ressent bien la différence. Par contre, comment tu met en cache l'affichage?
Hors ligne
Pages: 1