texy dvojí ukládání do db
- Filip Procházka
- Moderator | 4668
jenom nástin:
public function renderDefault()
{
// získání $clanek
$this->template->clanek = $clanek;
}
v šabloně
{cache $clanek->id, tags => ['clanek#'.$clanek->id, 'clanky']}
{* jak nastavit texy jako helper do šablony je tisíc a jeden návod *}
{$clanek->text|texy}
{/cache}
potom budeš mít vždy správně vykreslený výstup, prohnaný texy.
Zpracovávat se to bude vždy jen jednou a nebo pokud smažeš v namespace
Nette.Template.Cache
podle tagu clanky
nebo
clanek#12345
, kde 12345 je ID článku.
- masterr
- Začátečník | 141
No ten texy výstup potřebuju jen v administraci pro editaci, ten html výstup jen v šabloně pro zobrazení, takže bych stejně mohl selectovat jen to co potřebuju a nesnížila by se tím rychlost scriptu, ne?
Jak moc urychlí načítání stránky cashování oproti načítání dat z db? (v případě běžnýho článku) Jaký to má výhody?
- bojovyletoun
- Člen | 667
v tomhle případě to asi smysl mít bude, protože inicializování
celého texy modulu a následná konverze si určitě něco řeknou (při
každém požadavku sic) . Kdyžto vzetí bloku z cache j prosté includování
souboru temp\cache\_Nette.Template.Cache\_8..
- Filip Procházka
- Moderator | 4668
Ono to zase tak úplně prosté není, je tam práce s meta informacemi atd. Ale každopádně to výrazně sníží nároky oproti vykonávání hromady regulárů :)
- masterr
- Začátečník | 141
Dík za objasnění, ale když bych to udělal tak že bych ukládal oba dva ty tvary (html,texy)do db a pak při zobrazování článku selectnul jen ten html výstup, tak tím pádem by mi tam nevadil ten texy tvar a nijak by nezatežoval server, nebo se pletu?
Pak bych nemusel používat cachování a vyšlo by to rychlostně a zátěžově na server podobně?
- Foowie
- Člen | 269
Tak rychlostní rozdíl databáze vs cache tady je. (Kdyby nebyl tak by cache
ani nemusela existovat)
Takže pokud děláš nějaký systém který bude hodně zatěžovaný, zvolil
bych cachování. Pokud děláš stránky, na které se přijde podívat denně
pár lidí, tak bych rozdíl mezi cache, db nebo i případně převod z texy
tvaru (nevím jak je to rychlé) moc neřešil.
- masterr
- Začátečník | 141
HosipLan napsal(a):
jenom nástin:
public function renderDefault() { // získání $clanek $this->template->clanek = $clanek; }
v šabloně
{cache $clanek->id, tags => ['clanek#'.$clanek->id, 'clanky']} {* jak nastavit texy jako helper do šablony je tisíc a jeden návod *} {$clanek->text|texy} {/cache}
potom budeš mít vždy správně vykreslený výstup, prohnaný texy. Zpracovávat se to bude vždy jen jednou a nebo pokud smažeš v namespace
Nette.Template.Cache
podle taguclanky
neboclanek#12345
, kde 12345 je ID článku.
No, ale takle mi to stejne furt bude tahat data nejprv z db a když budou v cashi tak se akorát nevypišou, ale furt je taham, ne?(tím docilím akorat toho ze se mi to prevede jednou tim texy)
Nebylo by lepší to cashovat už při ukládání do db? Že by se
to vždycky tahalo rovnou z cache?
Ale stejně nechápu moc tu logiku, k čemu je teda db, když mohl vše
ukládat do cashe, pak to z ní i tahat a upravovat a bylo by to
rychlejší?
Můžete mi to nějak osvětlit k čemu používat db, když je tu serverová cash?Dík
- Foowie
- Člen | 269
Cash je podle wiki „označujeme někdy případ placení v hotovosti,
úhradu hotovými penězi.“
Cache může být (pro větší rychlost) jen v paměti, takže nezaručuje
persistenci. Může se tedy klidně stát, že se cache celá pročistí klidně
každý den … Navíc cache neumí SQL atd atd …
A jak funguje DB snad víš a když ne tak google…
- Filip Procházka
- Moderator | 4668
jak to funguje, když použiješ navrhovaný postup:
- uložím si článek do databáze
- na stránku s článkem přistoupí člověk
- článek se načte z databáze
- článek se zpracuje pomocí texy (tady to žere hodně výkon)
- článek se uloží do cache
- článek se zobrazí
kdykoliv potom, pokud mám platnou cache …
- na stránku s článkem přistoupí další člověk
- článek se načte z cache (žádné zpracování pomocí texy!)
- článek se zobrazí
Co se týče „dotaz se provede vždy“, přečti si tohle vlákno : https://forum.nette.org/…lona-v-cache?…
- masterr
- Začátečník | 141
sry za cash, chtěl jsem napsat [keš]…
Jsem myslel že cache se pročistí jen když ji k tomu dám příkaz…
HosipLane asi nechápu tu logiku jak si mi napsal v tom příkladu. Podle toho, co píšeš mám tu cache využít jen na převod do toho html tvaru. Což podle mě vyjde na stejno jako uložit oba dva tvary a pak načítat jen ten html tvar.
Takle totiž načtu stejně ty data z db a pak se akorát hledá jestli je v cache už převedenej tvar, ale ten původní se pořád načítá. Je to tak nebo se pletu?
Nemělo by se to spíš řešit v presenteru(nebo modelu)? Když jsou data v cache tak je zobraz, když ne ulož je tam z db?
- Cifro
- Člen | 245
Ak ukladaš Texy aj vyrenderované html do DB, tak Texy parsuje len pri ukladaní do DB, a potom pri načítavaní už nie, lebo vytiahneš len stlpec s html a to vypišeš.
Ak nemáš obmedzenú veľkosť DB, a viac selectov z DB ako insertov do DB, tak ja by som asi použil to dvojité ukladanie aj texy aj html do databázy.
Editoval Cifro (2. 1. 2011 16:14)
- Filip Procházka
- Moderator | 4668
Jsem myslel že cache se pročistí jen když ji k tomu dám příkaz…
napsal jsem snad že ne? :)
Tady jde o to mít v databázi surové data, tak jak půjdou krásně
zpracovávat a nesrat si tam vygenerované html. Cache se naopak maximálně
hodí pro ukládání vygenerovaného html, dokonce je na to v latte i macro
{cache ...}...{/cache}
.
Samozřejmě pokud se ti protiví to mít v šablone, můžeš si to obsloužit v presenteru:
public function renderClanek($id)
{
$cache = Nette\Environment::getCache('MojeAplikace.Clanky.Texy');
if (isset($cache[$id])) {
$clanek = Model::findOne(array('id' => $id));
$texy = new Texy();
// nastavení texy ...
$clanek->text = $texy->process($clanek->text);
$cache->save($id, $clanek, array(
'tags' => array('clanek#'$id, 'clanky')
));
}
$this->template->clanek = $cache[$id];
}
<h1>{$clanek->title}</h1>
<div class="clanek">
{$clanek->text}
</div>
- Foowie
- Člen | 269
„Jsem myslel že cache se pročistí jen když ji k tomu dám příkaz…“ Cache obecně nezaručuje trvalou persistenci dat.
Jinak mělo by to být takhle:
Existuje záznam v cache pro daný článek?
- ANO
- zobrazí se z cache
- NE
- načte se z DB
- převede se z Texy do HTML
- uloží se do cache
- zobrazí se
- arron
- Člen | 464
HosipLan napsal(a):
Tady jde o to mít v databázi surové data, tak jak půjdou krásně zpracovávat a nesrat si tam vygenerované html. Cache se naopak maximálně hodí pro ukládání vygenerovaného html, dokonce je na to v latte i macro{cache ...}...{/cache}
.Samozřejmě pokud se ti protiví to mít v šablone, můžeš si to obsloužit v presenteru:…
Tohle vsechno mi prijde, ze je to jasne:-) Myslim, ze problem u masterra je ten, ze nevi, jak tohle prepsat rouzmne do sablony s pomoci makra {cache}. A osobne, taky moc nevim, jak bych to udelal :-) Naznac pls. :-)
- masterr
- Začátečník | 141
No mě jde taky o to, že od každýho toho článku (zboží) potřebuju udělat výtah čistýho textu na index, bez jakychkoli značek. To kdybych mel uložený v html muzu udelat pomoci php fce. Ale v tyhle podobe to udelat nemuzu.
(Většinou ten text upravu potřebovat nebude…)
Rychlý zdroj informací pro zaneprázdněné administrátory Chcete vědět, jak vyzrát na velké množství nových funkcí Exchange Serveru 2007, jak server...
Jak mám pak tohle řešit? Cashovat index je asi kravina. Mohl bych napsat vlastní fci, která by odstranila ty značky texy, asi jediná možnost, že?
Edit:Nebo ukládat ten malej text zvlášt? asi kravina, ne?
Editoval masterr (2. 1. 2011 17:42)
- masterr
- Začátečník | 141
Tak slavnostňě oznamuji : Úzpěšně jsem pro ,,cacheoval" ty ,,clanky" a jede to parádně Dík všem za help.
Ted k tomu druhému problému:
gmvasek napsal(a):
Můžeš použít něco typu
$this->template->perex = Nette\String::truncate(strip_tags($cache['text']), 150);
Kdy mám dostat ten text do keše v html podobe? Dalo by se udelat ze bych kontroloval posledni id clanku v keši textu a pak to id srovnal s poslednim id v db, a aktualizoval keš (v keši by byl object array se všema mini článkama),
nebo
bych mohl kazdej ten mini článek ukládat do keše samostatně(a overovat jestli tam je podle id vysledku z db), jenže bych to pak musel dát i do adminu, aby se při změně danýho článku smazala jeho keš, aby se výsledek rovnou projevil.
Oboje se mi to nezdá moc ideální, nenapadá vás něco lepšího?
- Filip Procházka
- Moderator | 4668
to rozhodně nebylo, ale implementovat by to mělo být velice jednoduché
Editoval HosipLan (6. 1. 2011 8:06)
- Ondřej Brejla
- Člen | 746
jtousek napsal(a):
Nemohl by sám od sebe…
Ale no fuj, chování „ala Bradavice“ není vítáno :-)