Seite 1 von 1

Performance Problem komplexe Navigation

Verfasst: 11. Apr 2019, 15:20
von oliwan
Hallo liebe Redaxos,

evtl. kann mir jemand bei einem regelmäßig auftretenden Performanceproblem helfen - immer wieder dauert der Aufurf einer Seite (Unterseite) bis zu 120 Sekunden - zumindest lt. Serverlog.

Als wahrscheinlichsten Kandidaten habe ich die Navigation in Verdacht - hier mein code:

Code: Alles auswählen

<?php
$path = explode("|",$this->getValue("path").$this->getValue("article_id")."|");
$path1 = ((!empty($path[1])) ? $path[1] : '');
$path2 = ((!empty($path[2])) ? $path[2] : '');

$nav_main = '';
$subMenuCount=1;
$subButton="";
$breadcrumb="";
foreach (rex_category::getRootCategories() as $lev1) {
$MaxLenName=15;
$enhance="";
	$hidden_ids = array(15,20,21,22,46);
	// Home und Footer-Links (AGB Wegbeschreibung Kontakt) sollen nicht in der Navi auftauchen
	if ($lev1->isOnline(true) && (!in_array($lev1->getId(), $hidden_ids))) {
		// 1st level start
		$lev1Size = sizeof($lev1->getChildren());
	    $twoline="";
     $NameLen=strlen(html_entity_decode($lev1->getValue('name')));
     
					if ($NameLen>$MaxLenName){$enhance="&nbsp;";$MaxLenName=24;}
		if ($lev1->getId() == $path1) {
			$breadcrumb.=$lev1->getValue('name');
			if ($lev1Size!='0'){
				$nav_main .='<div class="select"><a href="javascript:toggle('."'sub".$subMenuCount."'".');" class="select">'.$enhance.htmlspecialchars($lev1->getValue('name')).$enhance.'<span id="sub'.$subMenuCount.'button" data-text="-" class="button">+</span></a>';
				
			}else{
				$nav_main .= '<div class="select"><a href="'.$lev1->getUrl().'" class="select">'.$enhance.htmlspecialchars($lev1->getValue('name')).$enhance.'</a>';
			}
		} else {
   if ($twoline!=""){$twoline="class='twoLine'";}
			if ($lev1Size!='0'){
				$nav_main .='<div '.$twoline.' ><a href="javascript:toggle('."'sub".$subMenuCount."'".');">'.$enhance.htmlspecialchars($lev1->getValue('name')).$enhance.'<span id="sub'.$subMenuCount.'button" data-text="-" class="button">+</span></a>';
				
			}else{
				$nav_main .= '<div '.$twoline.'><a href="'.$lev1->getUrl().'">'.$enhance.htmlspecialchars($lev1->getValue('name')).$enhance.'</a>';
			}
		}

		// 1st level start
		$lev1Size = sizeof($lev1->getChildren());

			if ($lev1Size != "0") {

				$nav_main .= '
				<ul>';

					// START 2nd level categories
					foreach ($lev1->getChildren() as $lev2):
						if ($lev2->isOnline(true)) {
							$twoline="";
							if (strlen(html_entity_decode(htmlspecialchars($lev2->getValue('name'))))>$MaxLenName){$twoline="twoLine ";}
							if ($lev2->getId() == $path2) {
           $breadcrumb.=" - ".$lev2->getValue('name');
								$nav_main .= '
								<li id="sub'.$subMenuCount.'select" class="'.$twoline.'showMenu select"><a href="'.$lev2->getUrl().'" class="select">'.htmlspecialchars($lev2->getValue('name')).'</a></li>';								
							} else {
								$nav_main .= '
								<li id="sub'.$subMenuCount.'" class="'.$twoline.'hideMenu"><a href="'.$lev2->getUrl().'">'.htmlspecialchars($lev2->getValue('name')).'</a></li>';								
							}
						}
					endforeach;

			
			
			// Aktive Stücke als Submenu einhängen
			if ($lev1->getId()==16 && sizeof($titel)>0) {

					
						for ($lo=0;$lo<sizeof($dbid);$lo++){
							$lev2=$lev1->getChildren()[$lo];
							$twoline="";
							if (strlen(html_entity_decode($titel[$lo]))>15){$twoline="twoLine ";}
							if ($lo+31 == $path2) {
									$nav_main .= '
									<li id="sub'.$subMenuCount.'select" class="'.$twoline.'showMenu select"><a href="'.$lev2->getUrl().'?id='.$dbid[$lo].'" class="select">'.str_replace("&lt;","<",str_replace("&gt;",">",htmlspecialchars($titel[$lo]))).'</a></li>';								
								} else {
									$nav_main .= '
									<li id="sub'.$subMenuCount.'" class="'.$twoline.'hideMenu"><a href="'.$lev2->getUrl().'?id='.$dbid[$lo].'">'.str_replace("&lt;","<",str_replace("&gt;",">",htmlspecialchars($titel[$lo]))).'</a></li>';								
								}
								array_push($link,$lev2->getUrl().'?id='.$dbid[$lo]);
						}
					
			}
			$nav_main .= '
			</ul>';
			$subMenuCount++;
		}
			
			

		$nav_main .= '
		</div>';
	}
}

echo $nav_main;
?>
Ich denke, der code ist OK, bin aber nicht sicher, ob die Ausgabe hier auch ordentlich gecached wird/werden kann. In jedem Falle beobachte ich auf der Seite immer wieder, dass die Seite schon da ist, das Menu aber erst ne Sekunde oder zwie später erscheint?!

Hat jemand eine Idee - evtl. mach ich hier was grundsätzliches Falsch?

Bei der Gelegenheit - es ist ein Redaxo 5.6.5 / PHP 7.0.33

Wie läuft das eigentlich mit dem Cache? Wo kann ich prüfen, ob das sauer gecached wird (also in welchem Verzeichnis)?

Danke für die Hilfe schon im voraus!`
Oliwan

Re: Performance Problem komplexe Navigation

Verfasst: 12. Apr 2019, 10:04
von Anegg
Unäbhängig vom Cache: Von wievielen Einträgen reden wir hier?

Cache-Pfade findest du hier: https://redaxo.org/doku/master/pfade (siehe cache)

o/

Re: Performance Problem komplexe Navigation

Verfasst: 12. Apr 2019, 11:00
von oliwan
Hey!

Insgesamt 17 -> www.waldbuehne-heessen.de

Im Cache Verzeichnis finde ich Verzeichnis addon in den Unterordnern structure und templates enzelne Dateien -
ist das der Seitencache?


Liebe Grüße
Oliwan

Re: Performance Problem komplexe Navigation

Verfasst: 15. Apr 2019, 20:35
von Koala
Nur ein Schuss ins Blaue.

Du gehst hiermit immer und immer wieder das gleiche Array von Artikeln durch, die nicht angezeigt werden sollen:

Code: Alles auswählen

if ($lev1->isOnline(true) && (!in_array($lev1->getId(), $hidden_ids))) {

Zum einen frist das Performance und zum anderen ändert sich mal die Artikel-ID, musst du jedesmal diesen Navi-Code anfassen. Igittt ...

Eleganter wäre es doch, wenn du das Erscheinen in der Navi in den Artikel-Metadaten selbst festlegen kannst.
Dazu muss ein Metafeld angelegt werden und dieses dann entsprechend ausgelesen werden.

Das könnte dir Gedanklich dabei helfen: Ausgabe-Variablen / REX_ARTICLE

Re: Performance Problem komplexe Navigation

Verfasst: 20. Apr 2019, 21:14
von oliwan
Hey Sven,

danke für den Hinweis - dem gehe ich prompt mal nach ;-)

Wenn ich den Code überarbeitet habe, poste ich ihn hier für Nachahmer

Oliwan