[PHP + smarty] Smarty loopt vast op array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 23-09-2024
Hoi,

Na een intieme en gelukkige jarenlange relatie heb ik sinds 2 weken ruzie met Smarty. Door een nog onbekende reden output ie bij een aantal templates die eerst prima werkten nu een lege string. Geen error ofzo. Het ligt ook niet aan de output (headers/compressie whatever) - Smarty geef gewoon een lege string (strlen=0) terug. Na eindeloos debuggen sta ik op het punt dat ik even niet meer weet hoe ik dit kan oplossen.

Omdat mn template-systeem best complex werkt (veel templates-in-templates) heb ik aanvankelijk met divide-and-conquer gewerkt om het probleem te kunnen pinpointen. Er blijken meerdere stukken in de templates te zijn waar ie van over zn nek gaat, dus ik heb nu de eerste helemaal uitgeplozen. Het is een redelijk straightforward stukje code:

HTML:
1
2
3
4
5
[...]
{foreach from=$component_block_pages key=pageurl item=pagename}
        <option value="{$pageurl}">{$pagename}</option>
{/foreach}
[...]


De variabele $component_block_pages is netjes gevuld met een associatieve array, zoals je mag verwachten:

code:
1
2
3
[nieuwsberichten] => Het laatste nieuws
[about] => Over ons
enz...


Mijn theorie was dat er ergens in een key of value in de array iets 'raars' zat, dus ben ik de array eens gaan aanpassen:

Voor de duidelijkheid: $pages2 is de originele variabele. Om te debuggen assign ik $pages3 ipv $pages2

Stap 1
Eerst maar eens kijken bij welke key/value het misgaat. Dat blijkt de 26e entry van de array te zijn

PHP:
1
2
3
4
5
6
$counter = 0;
foreach ( $pages2 as $kp1=>$vp1 ) {
    $counter++;
    if ( $counter < 26 ) { $pages3[$kp1] = $vp1; }
    else { echo $kp1 . " -> " . $vp1 . "<br />"; }
}


Het gekke is dat ik niks vreemds aan de betreffende entry kan vinden. Deze is:

code:
1
demo_request -> Demo request


Stap 2
Maar... ligt het wel aan deze regel?

PHP:
1
2
3
4
5
6
foreach ( $pages2 as $kp1=>$vp1 ) {
    $counter++;
    if ( $counter < 26 ) { $pages3[$kp1] = $vp1; }
    elseif ( $counter > 26 ) { $pages3[$kp1] = $vp1; }
    else { echo $kp1 . " -> " . $vp1 . "<br />"; }
}


Nee. Uiteindelijk blijkt dat elke key/value na 26 Smarty doet crashen.

Stap 3
Ok. Ligt het uberhaupt aan de tekst in de key of value?

PHP:
1
2
3
4
5
6
$counter = 0;
foreach ( $pages2 as $kp1=>$vp1 ) {
    $counter++;
    if ( $counter < 26 ) { $pages3[$kp1] = $vp1; }
    else { $pages3["test" . $counter] = "test"; }
}


Zorgt er ook voor dat de template crasht. Huh???

Stap 4
Nu wordt ik redelijk wanhopig. Het zou niet uit moeten maken, maar toch maar eens proberen:

PHP:
1
2
3
4
5
foreach ( $pages2 as $kp1=>$vp1 ) {
    $counter++;
    if ( $counter < 26 ) { $pages3[$kp1] = $vp1; }
    elseif ( $counter < 27 ) { $pages3["test" . $counter] = "test"; }
}


Dit werkt! Maar als ik ipv "27" eens "28" invul dan crasht ie weer. What the hell? De array kan dus maximaal 26 entries bevatten? Of andere mogelijkheid: De key "test26" is prima maar "test27" geeft problemen? :?

Ik weet het even niet meer. Ik zit waarschijnlijk op de verkeerde plek te zoeken, omdat ik niks heb aangepast aan de code of templates. Maar dit is even het enige aanknopingspunt wat ik heb...
Ik zit hier dus al 2 weken op te klooien, en sta op het punt om mijn monitor/muis/toetsenbord/een ander niet-levend eigendom iets ergs aan te doen. Graag jullie tips!

Acties:
  • 0 Henk 'm!

  • daan.timmer
  • Registratie: Februari 2010
  • Laatst online: 07-09 13:19
Ik zou het antwoord niet weten, maar misschien wel handig om te vermelden welke versie van Smarty je gebruikt?

[ Voor 4% gewijzigd door daan.timmer op 24-08-2011 13:59 ]


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 23-09-2024
daan.timmer schreef op woensdag 24 augustus 2011 @ 13:58:
Ik zou het antwoord niet weten, maar misschien wel handig om te vermelden welke versie van Smarty je gebruikt?
2.6.7

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 23-09-2024
excuus, je hebt gelijk.

[ Voor 9% gewijzigd door xilent_xage op 24-08-2011 14:04 ]


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 23-09-2024
Nog even doorgeploeterd, en het wordt nog gekker:
Stap 5
PHP:
1
2
3
4
5
$counter = 0;
foreach ( $pages2 as $kp1=>$vp1 ) {
    $counter++;
    $pages3["test" . $counter] = "lala";
}


Doet de template ook crashen.

Stap 6
Het ultieme bewijs dat ik gek wordt:
PHP:
1
2
3
4
5
$counter = 0;
foreach ( $pages2 as $kp1=>$vp1 ) {
    $counter++;
    if ( $counter < 61 ) { $pages3["test" . $counter] = "lala"; }
}

Als ik "61" verander in "62" loopt ie vast. Bij 61 gaat ie nog wel goed.

Acties:
  • 0 Henk 'm!

  • Beatboxx
  • Registratie: April 2010
  • Laatst online: 26-10-2022

Beatboxx

Certified n00b

Ik denk dat het een bug is in Smarty?

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 23-09-2024
Stap 7
Ok, het heeft echt iets te maken met de lengte van de strings:
PHP:
1
2
3
4
5
$counter = 0;
foreach ( $pages2 as $kp1=>$vp1 ) {
    $counter++;
    if ( $counter < 62 ) { $pages3["test" . $counter] = "l"; }
}


Als ik in plaats van "lala" allen "l" toeken dan kan ie meer entries aan! Toch is de variabele niet extreem groot (140 key/values) ofzo, en ook de template valt nog wel mee (200 regels html). Maar er worden wel behoorlijk wat verschillende templates achter mekaar ingelezen. Duidt dit op iets als 'te weinig geheugen' oid?

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 23-09-2024
Beatboxx schreef op woensdag 24 augustus 2011 @ 14:22:
Ik denk dat het een bug is in Smarty?
alles kan, maar Smarty draait hier al 2 jaar naar volle tevredenheid zonder ooit dit soort problemen te hebben gehad...

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Kun je eens in je cache-map kijken hoe Smarty je code heeft gecompiled?

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 11-09 22:33
Welke foutmelding krijg je van Smarty/PHP?

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 23-09-2024
GlowMouse schreef op woensdag 24 augustus 2011 @ 14:26:
Kun je eens in je cache-map kijken hoe Smarty je code heeft gecompiled?
Das een goeie. En ook vreemd - de gecompilde cachefile ziet er op het eerste gezicht goed uit...
alex3305 schreef op woensdag 24 augustus 2011 @ 14:31:
Welke foutmelding krijg je van Smarty/PHP?
Geen.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
xilent_xage schreef op woensdag 24 augustus 2011 @ 14:32:
[...]


Das een goeie. En ook vreemd - de gecompilde cachefile ziet er op het eerste gezicht goed uit...
Werk dan verder met de cachefile en ga die versimpelen, want dan zou het een php bug kunnen zijn.

Acties:
  • 0 Henk 'm!

  • daan.timmer
  • Registratie: Februari 2010
  • Laatst online: 07-09 13:19
kan je eens voor de gein je memory usage bijhouden?
PHP:
1
echo memory_get_usage(true);

Dit telkens bij elke iteratie eventjes te printen?

Misschien is het een memory 'leak' ergens

[ Voor 9% gewijzigd door daan.timmer op 24-08-2011 14:51 ]


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
daan.timmer schreef op woensdag 24 augustus 2011 @ 14:50:
kan je eens voor de gein je memory usage bijhouden?
PHP:
1
echo memory_get_usage(true);

Dit telkens bij elke iteratie eventjes te printen?

Misschien is het een memory 'leak' ergens
Inderdaad, Smarty kan best heftig zijn, zeker met templates-in-templates. En het is ook een goeie verklaring voor het feit dat er ineens errors zijn, is er wat aan je environment veranderd? (Meer load, minder geheugen, meer hits o.i.d.)

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
Mijn gok, php heeft een update gehad, en iemand is vergeten de max memory limit op te hogen in php.ini Default staat ie vaak op 8 of 16m en dat is voor smarty met geneste templates en een bovenliggend framework voor de rest van de logica te weinig..

Driving a cadillac in a fool's parade.


  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 11-09 16:13
kwaakvaak_v2 schreef op woensdag 24 augustus 2011 @ 18:22:
Mijn gok, php heeft een update gehad, en iemand is vergeten de max memory limit op te hogen in php.ini Default staat ie vaak op 8 of 16m en dat is voor smarty met geneste templates en een bovenliggend framework voor de rest van de logica te weinig..
In dat geval zou PHP een error message moeten geven.

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 17:07

MueR

Admin Tweakers Discord

is niet lief

Die error message wordt vaak weggemoffeld omdat een hoop mensen werken met display_errors (al dan niet onwetend) op off, error_reporting op E_NONE etc. Het zou in ieder geval in de error logs van je webserver moeten staan.

Anyone who gets in between me and my morning coffee should be insecure.

Pagina: 1