Jak správně generovat feed?

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

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

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

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

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 pres druh = '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
+
+1
-

Ú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.