Jak správně generovat feed?
- Zuben45
- Člen | 268
Dobrý den,
potřeboval bych poradit, jak správně generovat Feed, mám jeden vytvořený,
ale server dostává dost zabrat při generování (načítá se okolo
1 000 produktů, k nim i parametry atd z dalších tabulek), nevíte
prosím jak by to šlo vylepšit ?
Presenter
public function renderDefault(){
$this->template->items = $this->products->products_main()->where('PRODEJ > 0 AND OID$CENKTGK08 NOT IN(?)',$this->feed->not_in);
$this->template->treenodes = $this->products->treenodes()->where('id NOT IN(?)',$this->feed->not_in);
}
public function getGallery($id){
return $this->products->product_gallery()->where('DOCEVDD01.OID$ODKAZ = ? AND DOCEVDM01.DRUH LIKE ?',$id,'%Galerie%');
}
public function getVideos($id){
return $this->products->product_videos()->where('DOCEVDD01.OID$ODKAZ = ? AND DOCEVDM01.DRUH LIKE ?',$id,'%Videa%');
}
public function getDocuments($id)
{
return $this->products->product_other_documents()->where('(RTRIM(DOCEVDM01.DRUH) NOT LIKE ? AND RTRIM(DOCEVDM01.DRUH) NOT LIKE ? AND RTRIM(DOCEVDM01.DRUH) NOT LIKE ?) AND DOCEVDD01.OID$ODKAZ = ?','%Videa%','%PIKTOGRAM%','%Galerie%',$id);
}
public function getParams($id){
return $this->products->product_params()->where('OID$CENKTGM01 = ?',$id)->orderBy("CENKTGK14.PORADI");
}
Latte:
<DATA>
<ITEMS>
{foreach $items as $item}
<ITEM>
<ID>{$item['OID$CENKTGM01']}</ID>
<CATEGORY_ID>{$item->SKUPINA}</CATEGORY_ID>
<TREENODE_ID>{$item['OID$CENKTGK08']}</TREENODE_ID>
<NAME>{$item->NAZEV}</NAME>
<CODE>{$item->KTGINTERNI}</CODE>
<SHORT_DESCRIPTION>{$item->POPIS}</SHORT_DESCRIPTION>
<DESCRIPTION>{$item->POPISDET}</DESCRIPTION>
<NOTE>{$item->POZNAMKA|striptags}</NOTE>
<NOTE_INT>{$item->POZNAMKA|striptags|truncate:50}</NOTE_INT>
<PRICE>{$item->PRODEJ}</PRICE>
<TAX>{$item->SAZBADPH}</TAX>
<MANUFACTURER>{foreach $presenter->getParams($item['OID$CENKTGM01'])->where('NAZEV = "Výrobce"') as $brand}{$brand->HODNOTA}{/foreach}</MANUFACTURER>
<QUANTITY>{$presenter->getDostupnost($item['OID$CENKTGM01'])}</QUANTITY>
<WEIGHT>{$item->HMOTNOST}</WEIGHT>
<WARANTY>{!$item->DELKAZARUKY} měsíců</WARANTY>
<PARAMETERS>
{foreach $presenter->getParams($item['OID$CENKTGM01'])->where('NAZEV <> "Výrobce"') as $param}
<PARAMETER>
<PARAMETER_NAME>{$param->NAZEV}</PARAMETER_NAME>
<PARAMETER_VALUE>{$param->HODNOTA}</PARAMETER_VALUE>
<PARAMETER_MJ>{$param->MJPAR}</PARAMETER_MJ>
<PARAMETER_TYP>{$param['P$TYP']}</PARAMETER_TYP>
<PARAMETER_SKUPINA>{$param->SKUPINAPAR}</PARAMETER_SKUPINA>
</PARAMETER>
{/foreach}
</PARAMETERS>
<OPTIONS>
{foreach $presenter->getListKusovnik($item['OID$CENKTGM01']) as $key => $group}
{foreach $presenter->getKusovnik($item['OID$CENKTGM01'],$group) as $option}
<OPTION>
<OPTION_ID>{$option['OID$CENKTGM01$2']}</OPTION_ID>
<OPTION_CODE>{$presenter->getItem($option['OID$CENKTGM01$2'])->KTGINTERNI}</OPTION_CODE>
<OPTION_CATEGORY_ID>{$option->SKUPINA}</OPTION_CATEGORY_ID>
<OPTION_CATEGORY>{$option->SKUPINA}</OPTION_CATEGORY>
<OPTION_NAME>{$option->NAZEV}</OPTION_NAME>
<OPTION_PRICE>{$option->PRODEJ}</OPTION_PRICE>
<OPTION_TAX>{$presenter->getItem($option['OID$CENKTGM01$2'])->SAZBADPH}</OPTION_TAX>
<OPTION_WARANTY>{$presenter->getItem($option['OID$CENKTGM01$2'])->DELKAZARUKY} měsíců</OPTION_WARANTY>
</OPTION>
{/foreach}
{/foreach}
</OPTIONS>
<DOCUMENTS>
<GALERIES>
{foreach $presenter->getGallery($item['OID$CENKTGM01']) as $picture}
<GALERIES_URL>http://data.technimax.cz/attach/eobchod/{$picture->CESTA}</GALERIES_URL>
{/foreach}
</GALERIES>
<PHOTOS>
{foreach $presenter->getDocument($item['OID$CENKTGM01']) as $photo}
<PHOTO_URL>http://data.technimax.cz/attach/eobchod/{$photo->CESTA}</PHOTO_URL>
{/foreach}
</PHOTOS>
<OTHERS>
{foreach $presenter->getDocuments($item['OID$CENKTGM01']) as $other}
<OTHERS_URL>http://data.technimax.cz/attach/artilky/{$other->CESTA}</OTHERS_URL>
{/foreach}
</OTHERS>
</DOCUMENTS>
</ITEM>
{/foreach}
</ITEMS>
<CATEGORIES>
</CATEGORIES>
<TREENODES>
{foreach $treenodes as $treenode}
<TREENODE>
<ID>{$treenode->id}</ID>
<OWNER_ID>{$treenode->owner_id}</OWNER_ID>
<NAME>{!$treenode->name}</NAME>
<DESCRIPTION>{$treenode->popis}</DESCRIPTION>
</TREENODE>
{/foreach}
</TREENODES>
</DATA>
Děkuji
Editoval Zuben45 (8. 1. 2016 13:53)
- jiri.pudil
- Nette Blogger | 1032
Mně přijde jako dobrý nápad generovat to cronem do statického, veřejně přístupného souboru a odkazovat pak na ten soubor. Nebude se to potom muset generovat pořád, díky cronu si navíc pohodlně určíš jak často (podle toho, jak moc ta data potřebuješ mít aktuální), přeneseš tím zátěž spojenou se servírováním obsahu z PHP na webserver a na úrovni serveru pak případně můžeš snadno zapojit i HTTP cachování apod…
- David Matějka
- Moderator | 6445
a k samotnemu kodu: mas tam asi 1+10*N dotazu, to si zoptimalizuj (treba ze v presenteru vyberes vyrobce pro vsechny produkty najednou apod.)
a optimalizuj samotne dotazy – zkontroluj, jestli mas spravne indexy,
optimalizuj schema. treba ty dotazy druh LIKE %Videa%
mohou byt
problematicky, s %
na zacatku u LIKE se nenecha dobre vyuzit
index, takze si nejlepe udelej nejaky fixni seznam tech druhu, at se muzes
dotazovat pres druh = 'videa'
- Zuben45
- Člen | 268
jiri.pudil napsal(a):
Mně přijde jako dobrý nápad generovat to cronem do statického, veřejně přístupného souboru a odkazovat pak na ten soubor. Nebude se to potom muset generovat pořád, díky cronu si navíc pohodlně určíš jak často (podle toho, jak moc ta data potřebuješ mít aktuální), přeneseš tím zátěž spojenou se servírováním obsahu z PHP na webserver a na úrovni serveru pak případně můžeš snadno zapojit i HTTP cachování apod…
Děkuji za odpověď.
To jsem chtěl udělat, jen prve potřebuji vědět jak dlouho a jak moc to
zatíží server.
David Matějka napsal(a):
a k samotnemu kodu: mas tam asi 1+10*N dotazu, to si zoptimalizuj (treba ze v presenteru vyberes vyrobce pro vsechny produkty najednou apod.)
a optimalizuj samotne dotazy – zkontroluj, jestli mas spravne indexy, optimalizuj schema. treba ty dotazy
druh LIKE %Videa%
mohou byt problematicky, s%
na zacatku u LIKE se nenecha dobre vyuzit index, takze si nejlepe udelej nejaky fixni seznam tech druhu, at se muzes dotazovat presdruh = 'videa'
Dobře, díky moc, no s tím schéma bude trochu problém, protože mám zakázáno si hrát takhle s db, jen přidat vlastní tabulky a s nimi už mohu pracovat, ostatní jen na výpisy a zápisy.
Editoval Zuben45 (9. 1. 2016 12:48)
- cubic
- Člen | 45
Úplně k původnímu dotazu. Na několika e-shopech, kde je víc než 1000 produktů, si XML pro jednotlivé produkty předgenerovávám. Změní se data u produktů ⇒ přegeneruju fragment XML. Vypisují se tam parametry, počítají ceny apod. Když potom přijde požadavek na feed, jen jednoduše vypíšu a spojím hotové kusy XML. Feed je vždy aktuální (cronem by to bylo např. jen 1× za hodinu) a zároveň se pořád negeneruje to samé znovu a znovu, když se změní třeba jen 3 produkty z 1000.