jaký má smysl cache v šablonách?
- xtbman
- Člen | 24
Ahoj!
prosím o radu ohledně „kešování“ v šablonách.
Má smysl „kešovat“ například výpis komentářů např:
<?php
{cache)
{foreach $comments as $comment}<div>{$comment}</div>{/foreach}
{/cache}
?>
když v presenteru resp. modelu nemám možnost získat klíč cache ze
šablony tudíž znovu tahám commenty z db, přičemž tyto data nevyužiju,
protože si je vytáhnu z cache.
Pokud budu cachovat na úrovni modelu i v šablonách, tak stejně budu sahat
2× pro stejná data do cache.
Jaký má tedy vlastně význam cache v šablonách?
Prosím nějakého nette profíka o vysvětlení a radu :-)
Předem díky!
- jtousek
- Člen | 951
Cache v šablonách má význam hlavně pokud data z modelu taháš „on demand“, tzn. jen tehdy, když jsou potřeba (nexistuje validní cache záznam).
Navíc potřebuješ cache invalidovat když se objeví nový komentář, to se dělá pomocí tagů:
{* Předpokládám, že $article je instance Nette\Database\ActiveRow *}
{cache $article->id, tags => ['comments/' . $article->id]}
<div n:foreach="$article->related('comments') as $comment">
{*...*}
</div>
{cache}
Potom při přidávání/editaci/mazání komentáře musíš provést invalidaci cache dle tohoto tagu, aby se změna projevila.
Editoval jtousek (5. 5. 2012 8:28)
- xtbman
- Člen | 24
to ano, ale pokud budu vypisovat článek
<?php
{cache $article->id, tags => ['comments/' . $article->id]}
<div>
{article->author}
</div>
<div>
{article->dateOfPost}
</div>
<div>
{article->content}
</div>
{cache}
?>
tak ten článek musím přidat do šablony v presenteru
<?php
$this->template->article = $this->articleModel->getArticle($id);
?>
v tomto případě i když v šabloně vytáhnu článek z cache tak ho
presenter bude tahat v podobě objektu z modelu.
i v případě že bych „kešoval“ i na úrovni modelu:
<?php
$this->template->article = $this->articleCachedModel->getCachedArticle($id);
?>
tak nejdříve vytáhnu článek jako objekt v modelu, předám ho šabloně
která ho stejně nevyužije protože si vytáhne již „zakešovanej“ html
kód z cache.
Má tedy smysl toto dvojí „kešování“ nebo v tomto případě plně
stačí cache na úrovni modelu?
Děkuji za odpověď.
- Vojtěch Dobeš
- Gold Partner | 1316
Tím on demand se myslí že si kupříkladu do šablony předám nějakou kolekci dat, která se reálně načte z databáze až v iteraci – obalením foreache do cache tedy způsobím, že dotaz na databázi vůbec nebude proveden.
Takováto dvouvrstvá cache mi přijde jako overkill, na úrovni modelu dává smysl cachovat náročné operace, výsledky složitých dotazů, ale ne jednotlivé modely jen načtené z DB. Navíc přesně jak píšeš, tahle konkrétní dvojice výhody dvou cachí zcela zabíjí. V tomto případě mi jako nejefektivnější přijde využít šablonovou cache – nicméně pro výpis jednoho článku na stránce to asi ani nemá smysl.
- xtbman
- Člen | 24
díky za odpovědi :-)
tedy pokud tomu rozumím tak ani nemá smysl tak malé entity jako je jeden
článek cachovat, ale pokud bych tahal například všechny články a
předával je jako objekty vlastní třídy s vlastními metodami např. :
<?php
public function findAll($limit = null)
{
$rows = $this->order('name')->limit($limit);
$articles = array();
foreach ($rows as $row) {
$article = new Article(
$row->id,
$row->author,
$row->content,
);
$articles[] = $article;
}
return $articles;
}
?>
výsledek takové metody má již smysl cachovat?
toto uvádím spíše jako jen příklad.. zajímá mě především nějaká pomyslná hranice, kdy je rychlejší db a kdy aplikaci urychlí „zakešování“ dat. Tedy co se pokládá za náročný / složitý proces.
Omluvte tyto pro někoho možná stupidní otázky, ale ve škole nás nenaučej nic tak musim hledat jinde :-)
- Vojtěch Dobeš
- Gold Partner | 1316
Popravdě řečeno jsem ještě nedělal na aplikaci, kde bych musel cachování řešit (což samozřejmě především znamená, že jsem nedělal na aplikacích pro tisíce uživatelů – čím víc uživatelů, tím více začíná pálit každý kousek práce serveru navíc). Nejlepší je asi měřit a podle toho se rozhodovat – zkusit to čistě s DB, se souborovu cachí… existují aj další úložiště :). Ideální je, pokud lze aplikaci jednoduše škálovat, jakmile to bude potřeba. Na začátku projektu asi nemá smysl řešit cachování, jakmile však začne aplikace vykazovat velkou zátěž, tak začít hledat (ideálně měřením), kde jí lze ulevit.