Endlose Rekursion?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Endlose Rekursion?

    PHP-Code:
        function get($tplname$forceparsing 0) {
            global 
    $dba;//DB-Objekt importieren

            
    if(isset($this->templatecache[$tplname]) && $forceparsing == 0) {//check if template was already parsed
                
    $this->lasttemplate $this->templatecache[$tplname];
            } else {
                
    $rec $dba->queryfirst("SELECT value FROM ph_templates WHERE name = '$tplname'");
                
    $this->lasttemplate $rec["value"];
                
    $this->templatecache[$tplname] = $this->lasttemplate;
            }
            
            if(
    $this->showhtmlcomments) return "\n<!-- /// START TEMPLATE: $tplname -->\n".$this->parse($this->lasttemplate)."\n<!-- /// END TEMPLATE: $tplname -->\n";
            else return 
    $this->parse($this->lasttemplate);
        } 
    Das ist die Funktion die aus 'ner Datenbank Templates liest und sie, nachdem sie durch die funktion parse() gelaufen ist, wieder zurückgibt.

    parse():
    PHP-Code:
        function parse($tpl) {
            
    $tpl str_replace("\"""\\\""$tpl);//hier müssten 3 Slashes sein, wurde vom Board geschluckt
            
    return preg_replace('/\{(.+)\}/e''$this->get("$1")'$tpl);
        } 
    Kann es nun sein, dass in der Zeile mit dem return, das sich $this->get() unendlich oft wieder selbst aufruft(von get nach parse, wieder nach get, wieder nach parse usw.)?
    Das Problem ist nämlich, dass die Seite nicht fertig wird und hin und wieder der Apache(!) abstürzt.
    Benutze PHP 4.2.1 als Modul im Apache , MySQL 3.23.46.
    Zuletzt geändert von Nezzar; 21.08.2002, 19:06.
    "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

  • #2
    schaut so aus...
    Du rufst jeweils die andere Funktion in jedem Fall aus der anderen auf auf.
    Zuletzt geändert von MelloPie; 21.08.2002, 18:56.
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      Aber irgendwann gibt es keine Teile mehr im String die geschweiften Klammern umschlossen sind, demzufolge müsste dann auch die Rekursion beendet werden.
      "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

      Kommentar


      • #4
        Hi,

        also was rudimentär in PHP4 vorgeht, dass es zu diesen Fehler kommt, kann ich nicht beurteilen. Aber das Problem "verschachtelter" return- Anweisungen gibt es auch in andere Programmiersprachen.

        Und zwar setzt die CPU bei return eine Adresse im 32bit-TSS (Task-Statement-Segment), ein 104 Byte großer Task-Switch. Dort bilden Byte 0 u. 1 dabei einen Link zur vorherigenden Task-Segment, damit ein Rücksprung ermöglicht wird und diesen hast Du mit den zweiten return vielleicht überschrieben.

        Merke:
        Auch wenn Inline-Definitionen meist einen guten Stil verkörpern, so beinhaltet er bei verschaftelten Sprunganweisungen oft Risiken!
        cu

        Blaster
        Yuppi, endlich Elite ...

        Kommentar


        • #5
          ...hmmm, klar läuft das ewig. jede funktion ruft immer die andere auf.
          wann und wo genau soll denn da ein ende sein?!
          eval(str_pad(aa|db,4,slarti^~äü_i_)." \"áú¾ïùû䶳Ðäýï©üèíþç£þé\"^~\"no bugs, only features\";");

          Kommentar


          • #6
            @slarti: Na wenn die die regex nicht mehr zutrifft.
            @blaster: Und wie genau kann ich das jetzt verhindern? Schließlich klappt das ja bei anderen rekursiven Funktionen auch?
            "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

            Kommentar


            • #7
              Na, wie wohl?! - Einfach über eine simpele Zwischenvariabel:

              PHP-Code:
              function get($tplname$forceparsing 0) {
              // ...

              $temp $this->parse($this->lasttemplate);
              // nach einen Simikolon werden im Regelfall die CPU - Register 'befreit'!

              else return $temp;

              Außerdem kannst Du den Fehler jetzt weiter interpolieren.

              cu

              Blaster
              Yuppi, endlich Elite ...

              Kommentar


              • #8
                OK, die endlose Rekursion wurde nicht von der RegEx verursacht sondern von 'nem str_replace(), dass hier im Code nicht zu sehen ist. War trotzdem sehr lehrreich, Blaster.
                "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

                Kommentar

                Lädt...
                X