Hallo, lieber Forumbenutzer. Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen Möglichkeiten der Kommunikation ist das Forum ein wenig eingeschlafen und weniger Nutzer benutzen das Forum aktiv (trotzdem lohnt es sich evtl. hier nach Lösungen zu suchen oder seine Frage zu stellen).

Wir empfehlen, für deine Fragen/Probleme aktuell (zusätzlich) Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: http://redaxo.org/slack/
oliwan
Beiträge: 80
Registriert: 21. Jan 2010, 22:35
Wohnort: Hamm

Performance Problem komplexe Navigation

11. Apr 2019, 15:20

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
may the source be with you

Anegg
Beiträge: 2
Registriert: 11. Apr 2019, 11:39

Re: Performance Problem komplexe Navigation

12. Apr 2019, 10:04

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/

oliwan
Beiträge: 80
Registriert: 21. Jan 2010, 22:35
Wohnort: Hamm

Re: Performance Problem komplexe Navigation

12. Apr 2019, 11:00

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
may the source be with you

Benutzeravatar
Koala
Beiträge: 1612
Registriert: 3. Okt 2005, 13:20

Re: Performance Problem komplexe Navigation

15. Apr 2019, 20:35

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
<?php print $Footer; ?>

Sven

Ich würde ja die Welt verändern,
doch der Quellcode ist mir zu absurd!


REX 5 :: Tricks und Tipps
REX 5 :: Modulesammlung

Wiki zu Redaxo 3 und 4 (!nur noch im Webarchiv!)

oliwan
Beiträge: 80
Registriert: 21. Jan 2010, 22:35
Wohnort: Hamm

Re: Performance Problem komplexe Navigation

20. Apr 2019, 21:14

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
may the source be with you

Zurück zu „Templates/Navigationen [R5]“