jaký má smysl cache v šablonách?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
xtbman
Člen | 24
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.

xtbman
Člen | 24
+
0
-

dobře, díky :)
koukam že se mám zase co učit.. dosud jsem nějaké měření / testování příliš neřešil (jen phpunit)
teď už jen pokud by jste někdo měl po ruce nějaký článek/tutoriál o měření výkonu webových aplikací sem sním :-)