Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je suis en train de finir un site avec ZF et je cherche à l'optimiser avec Zend_Cache. Cependant, je me retrouve à des choix à faire en terme de programmation.
j'ai par exemple une liste de news à afficher. En PHP, avec Zend_DB, je fais la requête puis une boucle foreach, puis j'effectue le rendu en passant mon tableau de données à Smarty.
$table = new Table_News(); $rowset = $table->fetchAll(); if ($rowset->valid()) { foreach ($rowset as $uneNews) { $data[] = array( 'id_news' => $uneNews->id_news, .... ); } } // Rendu $view->assign('data', data); $xhtml = $view->render('news.tpl'); echo $xhtml;
news.tpl
{foreach from=$data item=uneNews} // Code XHTML d'une news <div class="news"> ..... </div> {/foreach}
Comment utiliser Zend_Cache dans ce processus ? J'ai deux choix :
#1
$table = new Table_News(); $rowset = $table->fetchAll(); if (! $xhtml = $cache->load('news')) { if ($rowset->valid()) { foreach ($rowset as $uneNews) { $data[] = array( 'id_news' => $uneNews->id_news, .... ); } } // Rendu $view->assign('data', data); $xhtml = $view->render('news.tpl'); // Mise en cache $cache->save($xhtml) } echo $xhtml;
news.tpl ne change pas.
#2
$table = new Table_News(); $rowset = $table->fetchAll(); if ($rowset->valid()) { foreach ($rowset as $uneNews) { if (! $news = $cache->load('news' . $uneNews->id_news)) { $view->assign('id_news', $uneNews->id_news); $view->assign('titre', $uneNews->titre); $view->assign('contenu', $uneNews->contenu); .... // Rendu $news = $view->render('news;tpl'); // Mise en cache $cache->save($news); } $xhtml .= $news; } } // Rendu echo $xhtml;
Avec news.tpl :
<div class="news"> {$titre} : {$contenu} ... </div>
Il y a des différences de boucles PHP/Smarty dans les deux cas. Laquelle choisir / est la mieux optimisée selon vous ?
Merci
Dernière modification par ALkyD (22-11-2008 17:46:50)
Hors ligne
Bonjour,
J'ai tendance à penser qu'un système de cache ne doit pas affecter la vue donc plutôt solution 1.
Par ailleurs ta solution 2 multiplie le nombre de données en cache, ce qui n'est jamais souhaitable. Si on pousse le truc à l'extrème, quand tu as autant de données dans ton cache que dans ta base, c'est à peu près sur que ton cache n'ira pas plus vite que ta base....
Sinon dans ton exemple #1, la ligne $rowset = $table->fetchAll(); doit être à l'intérieur de ton if, sinon tu perds l'intérêt du cache
A+, Philippe
Hors ligne
J'ai également pensé à la solution n°1 mais l'inconvénient est que si je fais la moindre petite mise à jour pour une news, je suis obligé de détruire le cache, et donc la liste de toutes les news pour le recréer. Avec la 2ème solution, il "suffit" de supprimer le cache de la news correspondante.
Je gère également la pagination : 15 news par page, ce qui m'oblige à passer le numéro de page dans l'identifiant du cache, et donc à détruire tous les caches correspondants en cas de MAJ.
J'ai le même problème avec les commentaires des news. Pour chaque news il est possible d'ajouter des commentaires (comme dans un blog classique). Là encore je ne sais pas quelle solution prendre, car si je suppose que de nouveaux commentaires sont ajoutés de façon régulière, le cache de liste des commentaires est sans cesse recrée à chaque ajout...
Hors ligne
Ce n'est pas gênant surtout si ton invalidation de cache est bien ciblé.
Le cache d'une page est rapide à générer, ce qu'il faut éviter c'est l'invalidation complète des caches.
Hors ligne
Tu n'auras à mon avis jamais de problème de perf sur des mises à jours je pense. Les problèmes viennent toujours du nombre de lecteur, jamais du nombre de contributeur (à moins que tu fasses un twitter, mais tu nous l'aurais dit)...
Mon opinion, c'est qu'il faut vraiment optimiser la lecture et pas l'écriture, le nombre d'écriture étant en général complètement négligeable... (cela dit, ça dépend quand même un peu de ton site effectivement...)
A+, Philippe
Hors ligne
J'ai tout de même décidé de cacher les news/commentaires un par un plutôt que la liste entière. Par contre pour le livre d'or que je vais implémenter, je vais cacher toute la liste. Je pense que je me rendrais compte des performances à long terme de chaque solultion car cela dépend de la fréquence des mises à jour / nombre de visiteurs.
Merci pour vos réponses
Hors ligne
Pages: 1