Cacheování kompletního výstupu

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

Ahoj,

chtěl bych udělat aplikaci, kde bude poměrně dost lidí přistupovat k jedné a té samé stránce, která je tvořená mnoha dotazy do databáze a několika provázanými foreachi v šablonách.

Pokud bych tedy chtěl tato data nějak cacheovat, je správné řešení udělat přes model dotaz do databáze, v presenteru tento objekt uložit do cache (fáze 1), pak jej předat šabloně, kde se blok okolo foreachů také uloží do cache (fáze 2), nebo by se cacheování mělo řešit nějak jinak?

Edit: Používám dibi, kde neumím použít lazy dotaz do db až v šabloně jako to jde u Nette\Database

Chtěl bych de facto docílit toho že normální návštěvníci dostanou HTML které jim na základě práce v backendu předgenerovává admin tak aby se co nejméně zatěžoval server.

Děkuji moc za názory a rady.

Editoval lunak83 (27. 12. 2013 23:51)

enumag
Člen | 2118
+
0
-

Té lenosti dotazů se dá snadno docílit tak, že nepředáš přímo data, ale jen callback, který ty data vrátí je-li zavolán.

lunak83
Člen | 47
+
0
-

Aha, díky moc, takže si předám do šablony něco jako $presenter a pak vypisuji $presenter->getData()?

enumag
Člen | 2118
+
0
-

$presenter se do šablony předává automaticky. Myslel jsem to ale trochu jinak:

public function renderDefault()
{
	$this->template->dataAccessor = function () {
		return $this->model->getData(); // $this here requires PHP 5.4, hack it with $that if you need 5.3
	}
}
{foreach $dataAccessor() as $item}
	{* ... *}
{/foreach}
lunak83
Člen | 47
+
0
-

Aháá, to jsem vůbec nevěděl že jde udělat. Díky moc!

Editoval lunak83 (28. 12. 2013 19:36)

nAS
Člen | 277
+
0
-

Případně si můžeš v Application->onResponse uložit celý výstup. Potom se v bootstrapu, ještě před načtení Nette, podívat, jestli už tato stránka není vygenerovaná a případně ji vypsat. To má tu výhodu, že se vůbec nemusí načítat a parsovat desítky/stovky souborů, takže to je ohromný boost výkonu u hodně navštěvovaných aplikací. Ale zase je s tím trochu práce, tak bych to dělal až se to bude opravdu hodit a ne pro strýčka Příhodu :) Je tam potřeba ošetřit různé cookies, přihlášené uživatele, .. prostě vše, co tvoje aplikace používá.