Navigation_main out of memory

Alles rund um Module und Plugins in CONTENIDO 4.9.
Antworten
Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Navigation_main out of memory

Beitrag von Faar » Di 18. Okt 2016, 13:29

Ein angepasstes Navigation _Main Modul produziert mir ein Out of Memory:

Code: Alles auswählen

 PHP Fatal error:  Allowed memory size of 104857600 bytes exhausted (tried to allocate 262144 bytes) in /dingens/contenido/plugins/smarty/smarty_source/sysplugins/smarty_internal_template.php on line 304
Ich hatte dieses Modul etwas abgeändert und vorerst fehlte der Part mit der "active" CSS-Klasse in aktiven Kategorien, die über ein Breadcrump-Schnipsel ermittelt werden.
Nun baute ich diese Funktion wieder ein und siehe da, out of memory.

Nun, wenn man mal print_r($tree); im Modul macht, ahnt man sehr schnell, weshalb der Speicher zu wenig sein könnte :roll:

Könnt ihr die "cCategoryHelper" Klasse verbessern, so dass zur Menü-Erstellung nur die Daten (als Array :!: ) ausgegeben werden, die auch für ein Menü benötigt werden?
Ich weiß nicht so recht, was es bringen soll, wenn fast das komplette Contenido System als Objekte im $tree gespeichert wird, obwohl ich für einen Kategoriebaum nur wenige Daten brauche?
Nun, Contenido 4.9 ist schon erheblich langsamer und ressourcenfressender als 4.8 aber solche Auswüchse müssten eigentlich nicht sein.
Nicht jeder hat einen Server mit vielen GB RAM für Contenido zur Verfügung.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: Navigation_main out of memory

Beitrag von rethus » Di 18. Okt 2016, 15:36

Wow, 104 MB Navigation, das is ne Menge Holz :).

Ich vermute, das sich da irgend eine WHILE oder FOR-Schleife in die "endlose" begeben hat... hast du Xdebug auf deinem Server,
dann könntest du mit nem Profiling mal ganz genau nachsehen, wo es da im Argen liegt.

Wobei, mir fällt gerade ein, die ein oder andere Navi ist via Smarty recursiv programmiert. Hab es gerade nicht auswendig im Kopf (müsste eigentlich der test auf subkategorien sein)... wenn die da sind, ruft er ein Smarty-Sub-Template auf.
Vielleicht erzeugt das deine Endlosschleife?!
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Navigation_main out of memory

Beitrag von Faar » Di 18. Okt 2016, 16:25

rethus hat geschrieben:Wow, 104 MB Navigation, das is ne Menge Holz :).
Das ging am Ende weiter, als mehr Speicher zur Verfügung gestellt wurde.
Ich vermute, das sich da irgend eine WHILE oder FOR-Schleife in die "endlose" begeben hat...
Genau so sah es aus.
Es muss an diesem hier gelegen haben:

Code: Alles auswählen

{include file="navigation_main/template/get.tpl"
         tree=$wrapper.subcats path=$path ulId=""}
Als ich es in einem neueren Modul etwas anders aufgebaut anders sah, habe ich das eingebunden:

Code: Alles auswählen

{if $idcat|in_array:$path and !empty($wrapper.subcats)}
    {include file="navigation_main/template/get.tpl" tree=$wrapper.subcats path=$path ulId=""}
{/if}
Da wird erst abgefragt, ob denn überhaupt Unterkategorien da sind.
Was mir hier absolut nicht gefällt, das ist der feste Pfad.
Wenn man dann mal ein Template oder den Modulnamen wechseln will, muss man es hier auch anders vertexten.
Ich werde das bei meinen Menü-Modulen mit meinem Template-Chooser verknüpfen und den Template-Pfad per Platzhalter übergeben.
dann könntest du mit nem Profiling mal ganz genau nachsehen, wo es da im Argen liegt.
Naja, ich hab am Modul zuerst das $path dazu eingebaut

Code: Alles auswählen

{if $idcat|in_array:$path}
            {assign var="aClass" value='active'}
        {else}
            {assign var="aClass" value=''}
        {/if}
und dann dieses was ich oben beschrieben habe und dann war out of memory.
Dann habe ich diese if in_array(path) darum herum gebaut und dann war wieder gut.
Wobei, mir fällt gerade ein, die ein oder andere Navi ist via Smarty recursiv programmiert.
Es sind eigentlich nur foreach-Schleifen.

Code: Alles auswählen

{foreach from=$tree item=wrapper}
Aber wenn die mit dem gleichen Template nochmal aufgerufen werden... :?:
Ich glaube, ich habe den Fehler:
Bei meinem Modul werden mehrere Kategorie-Bäume ausgelesen und mittels Smarty über eine weitere foreach-Schleife ausgelesen, die über dem kompletten Template steht, quasi als Wrapper.
Erst darin befindet sich die normale Schleife mit dem $tree.
Wenn Smarty eine Subcat findet, baut es das Template nochmal ein und versucht nochmal die ganz große Schleife zu fahren.
Hab es gerade nicht auswendig im Kopf (müsste eigentlich der test auf subkategorien sein)... wenn die da sind, ruft er ein Smarty-Sub-Template auf.
Vielleicht erzeugt das deine Endlosschleife?!
Das ist es vermutlich, aber dort wird kein Sub-Template aufgerufen sondern das normale.
Wobei aber $tree mit den Unterkategorien belegt wird.

Code: Alles auswählen

tree=$wrapper.subcats
Das geht solange im Standardmodul gut, weil dort dann $tree mit Subcats belegt ist und sich sonst nichts ändert.
Aber in meinem Fall wird im großen Supertree item=tree gesetzt, womit wir wieder beim Anfang sind.
Usw.

Das läuft jetzt nur deshalb, weil ich das Standardtemplate ausgewählt habe und nicht meines für den Supertree.
Was nun? Mit zwei Templates fahren? Oder kann man Smarty beibringen, dass es sich gerade in einer Rekursion befindet?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Navigation_main out of memory

Beitrag von Faar » Mi 19. Okt 2016, 14:50

Ich hab das jetzt vorerst mal mit einem zweiten Template gelöst, das im zweiten Durchlauf als rekursiv-taugliches Template in Smarty includiert wird.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Antworten