Otázky k fungování cache – platnost, vlastnictví
- microcz
- Člen | 62
Ahoj předem se omlouvám za hloupé otázky…
1. Vytvořil jsem si cache podle dokumentace:
$storage = new Nette\Caching\Storages\FileStorage('temp');
$cache = new Cache($storage);
$dataFea = $cache->load("featured");
if ($dataFea === null) {
$qFea = 'SELECT * FROM view_featured_image ORDER BY id DESC LIMIT 5';
$dataFea = $this->db->fetchAll($qFea);
$cache->save("featured", $dataFea);
}
$this->template->feaImgs = $dataFea;
2. V latte jsem pak použil takto (je to správně?)
{* Featured (carousel) *}
{cache 'featured'}
<div class="row thumb-gutter">
<div class="col-xs-12">
<div class="panel panel-sc">
<div class="panel-heading">
<h1 class="text-uppercase h4" n:block=title>Featured Images</h1>
</div>
<div class="panel-body">
<div id="carousel-featured" class="carousel slide" data-ride="carousel" data-interval="5000">
<div class="carousel-inner" role="listbox">
{var $active = true}
{foreach $feaImgs as $img}
<div class="item {if $active}active{/if}">
<a href="{plink Image:, 'uname' => $img->uname}">
<img src="{$img->uname |jpgbig}" alt="{$img->name}" />
</a>
</div>
{$active = false}
{/foreach}
</div>
<ol class="carousel-indicators">
{foreach $feaImgs as $img}
<li data-target="#carousel-featured" data-slide-to="{$iterator->getCounter() - 1}" {if $iterator->isFirst()}class="active"{/if}></li>
{/foreach}
</ol>
</div>
</div>
</div>
</div>
</div>
{/cache}
{* END Featured (carousel) *}
3. Pokud jsem udělal výše uvedené, znamená to, že i obsah z latte uzavřený mezi {cache} {/cache} je opravdu cachovaný? A že se „překreslí“ až v momentě uložení nového obsahu do „featured“ cache?
4. Když jsem cache vytvořil předcházejícím způsobem, kdy vyprší její platnost? Nikdy / za nějaké defaultně nastavený čas?
5. Je košér vytvořit si v aplikaci (v modelu) mechanismus, který když dojde ke změně databáze „view_featured_image“, tak smaže obsah „featured“ a nahraje nový? Nebo se to dělá jinak?
6. Jak je to s viditelností cache a) je globální pro všechny uživatele přistupující k aplikaci nebo b) je spojene jen s jednou sessionou?
7. Pokud platí a) jak docílím toho, že když uživatel 1 změní databázi, tak uživateli 2 se refreshne cache.
8. Pokud platí b) jak docílím toho, aby byla data nacachovaná pro všechny uživatele jednou?
Editoval microcz (2. 6. 2015 20:46)
- Luděk Veselý
- Člen | 29
2. Vypada to spravne, obecne ale funkcnost cache overis tak
ze zmenis to co je nakesovane a nemelo by se to menit.. napr
v 1. zmenis prvni zaznam v tabulce
view_featured_image
, obsah promenne $dataFea by mel zustat
nezmemen, mel by zustat stav pred zmenou v db. U 2. v te
sablone to overis obdobne.
3. Ano
4. Pokud nenastavis rucne kdy ma vyprset (expirovat) tak to „neomezene dlouho“, respektive nez ji smaze nekdo zvenci. V tvem pripade to znamena dokud nesmazes obsah slozky temp.
5. Koser to rozhodne je :) Obecne je pristupu k invalidaci cache vice a vzdy zalezi na konkretnim pouziti – zalezi jestli chces aktualni data nebo mene vytezovat db a to jde proti sobe. Pokud to jsou veci ktere je treba zobrazovat vzdy aktualni tak bych to resil tak jak popisujes. Pokud se data meni casto je mozne napr. nastavit pri ukladani dobu expirace – po vyprseni se data smazou sama. Tvuj pripad vypada jednoduse, tam bych jen pri ulozeni smazal cache, nahrani noveho obsahu uz mas napsane :)
6. Cache je sdilena v ramci aplikace. Pokud bys chtel aby byla svazana s jednim uzivatelem, slo by ke klicum pridavat jejich id.. Data jsou ale porat sdilena v ramci aplikace.
7. V tom kodu co pises mi prijde ze jsou vzdy kesovana
data stejna pro vsechny uzivatele, pak je proste jeden nacte a druhy vidi, jsou
jakoby sdilena.. Pokud bys chtel kesovat rekneme pro kazdeho uzivatele jeho
jmeno, pak si treba udelas pole
$data = [1 => 'geek', 2 => 'nettegeek'];
a to si ulozis do
kese pod nejaky klic $cache->save($key, $data);
.
Snad ti to pomuze s pochopenim kesovani, pokud jsem to napsal nesrozumitelne tak se ptej :)
- Unlink
- Člen | 298
Trošku staršie, ale na princípoch sa snáď nič nemenilo
https://www.youtube.com/watch?…
- David Matějka
- Moderator | 6445
- nikdy (pokud opravdu nevis, co delas) nevytvarej cache storage rucne. Nech
si injectnout
Nette\Caching\IStorage
, pak snadno vymenis implementaci treba za redis nebo cokoliv jinyho - ty nejak divne kombinujes dvoje cache. Nejdriv v presenteru nacachujes vystup z dotazu a pak znovu cachujes v sablone vystupni HTML. To je zbytecny. Staci jedno cachovani. Jen v pripade, ze budes chtit cachovat az v sablone, tak musis zajistit, aby se provadel dotaz az lazy. Tedy az kdyz nad nim zacnes iterovat. Tak se deje kdyz pouzijes Database\Table vrstvu, v pripade samotneho query to budes muset obalit nejakym lazy iteratorem.
- ano a ne. Je cachovany, ale jak jsem zminil v 2), ty dve cahe spolu nesouvisi. Kdyz bys znovu upravil cache v tom presenteru, tak bude stejne porad nacachovane html.
5, 6. to, co hledas, jsou tagy :) https://doc.nette.org/cs/caching#…