Andi: Fehler bei Parsing von PHP-Dokumenten?

Hi Forum,

wir haben hier soeben eine lustige Sache, die wir uns einfach nicht erklären können:

Wir haben hier mehrere PHP-Dokumente, die sich je nach Ablauf gegenseitig inkludieren, was auch gewünscht ist. Es klappt auch so gut wie immer.
Manchmal jedoch bricht der Parsevorgang aus unerfindlichen Gründen einfach ab, und zwar ohne jede Fehlermeldung.

Folgender Code führt z.B. in dritter Ebene zu einem Fehler:

eigenefunktion("jhasjhasdgkhadsgh");
eigenefunktion("jhasjhasdgkhadsgh");
echo "hallo";
eigenefunktion("jhasjhasdgkhadsgh");

der erste Aufruf von eigenefunktion() wird noch durchgeführt, der zweite jedoch nicht (im Beispiel gibt die Funktion nur einen Text aus, also eigentlich nicht so fehlerträchtig). Es scheint so aus, als würde es nach einer gewissen Anzahl von eigenen aufgerufenen Befehlen irgendwie abgebrochen, aber auch wenn das Error-Reporting auf höchster Stufe steht, immer ohne Fehlermeldung! Es geht einfach nur nicht weiter.

Hat jemand von euch auch schon mal so einen Fehler beobachtet, und besser, vielleicht sogar rausgefunden worans liegt? Speicherprobleme können eigentlich ausgeschlossen werden, da das Skript in diesem Falle so gut wie gar keinen Speicher verbraucht (definitiv keine ihm zugesicherten 32 MB).

Wäre nett, wenn sich jemand melden könnte.

Andi

  1. Hello out there!

    Wir haben hier mehrere PHP-Dokumente, die sich je nach Ablauf gegenseitig inkludieren, was auch gewünscht ist. […] Es scheint so aus, als würde es nach einer gewissen Anzahl von eigenen aufgerufenen Befehlen irgendwie abgebrochen,

    Rekursive Aufrufe bis zum Stack-Overflow?

    Ohne Quellcode bleiben alle Glaskugeln trübe.

    See ya up the road,
    Gunnar

    --
    “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
    1. Rekursive Aufrufe bis zum Stack-Overflow?

      nein, es ist kein rekursiver Aufruf. Und wie gesagt, der Code ist absolut harmlos (jedoch zu groß um ihn hier zu posten). Es ist einfahc gegen alle Regeln. Als würde er sich überlegen "ach, jetzt hab ich keine lust mehr und hör auf".

      Für meinen geschmack hört sich das nach nem PHP-Bug an. Es handelt sich dabei um die nicht mehr so aktuelle PHP 4.3.10.

      Alles total strange...

      1. echo $begrüßung;

        Alles total strange...

        Sicherlich nicht. Eine Strategie, solch angeblichen Phänomenen auf die Spur zu kommen, ist:
        Entferne solange Teilestücke des Codes, bis der Fehler nicht auftritt. Der Fehler liegt dann darin oder ist ein Folgefehler davon. Kreise den Fehler weiter ein, indem du immer kleinere Teilstücke entfernst. Natürlich müssen diese Teilstücke auch sinnvoll entfernt werden. Es nützt nichts, wenn die Funktionalität nicht mehr gewährleistet ist oder durch Dummy-Werte nachgebildet werden kann. Außerdem ist diese Strategie umso einfacher, je klarer das Programm strukturiert ist. Spaghetti-Code ist für diese Methode weniger geeignet.

        Andersrum geht es natürlich auch: Fange eine neue Test-Datei an und kopiere solange Code hinzu, bis der Fehler aufgetreten ist. Oder anders: Versuche den Fehler mit dem kleinstmöglichen Code nachzuvollziehen.

        echo "$verabschiedung $name";

        1. Entferne solange Teilestücke des Codes, bis der Fehler nicht auftritt. Der Fehler liegt dann darin oder ist ein Folgefehler davon. Kreise den Fehler weiter ein, indem du immer kleinere Teilstücke entfernst. Natürlich müssen diese Teilstücke auch sinnvoll entfernt werden. Es nützt nichts, wenn die Funktionalität nicht mehr gewährleistet ist oder durch Dummy-Werte nachgebildet werden kann. Außerdem ist diese Strategie umso einfacher, je klarer das Programm strukturiert ist. Spaghetti-Code ist für diese Methode weniger geeignet.

          Morgen!

          Das ist ja genau das Problem, das habe ich gemacht und eben auch die Zeile gefunden, wo die Ausführung des Skripts einfach abbricht, und es handelt sich dabei eben um eine Zeile, die sogar ein und zwei Zeilen weiter oben noch ohne Probleme durchgelaufen ist (macht nur eine Ausgabe). Deshalb finde ich es ja nicht soo strange.

          Ich bin jetzt vielleicht kein absoluter PHP-Guru, aber ein kleiner auf jeden Fall ;-)

          1. echo $begrüßung;

            Das ist ja genau das Problem, das habe ich gemacht und eben auch die Zeile gefunden, wo die Ausführung des Skripts einfach abbricht, und es handelt sich dabei eben um eine Zeile, die sogar ein und zwei Zeilen weiter oben noch ohne Probleme durchgelaufen ist (macht nur eine Ausgabe).

            Dann versuche doch mal, das Problem mit dem kleinstmöglichen Code nachzustellen, und zeige ihn hier oder in einem der Paste-Dienste (phpfi.com etc.)

            echo "$verabschiedung $name";

            1. Dann versuche doch mal, das Problem mit dem kleinstmöglichen Code nachzustellen, und zeige ihn hier oder in einem der Paste-Dienste (phpfi.com etc.)

              hi!

              das hab ich auch schon probiert, keine chance. der tritt nur dann auf, wenn er lustig ist. Momentan kann ich ihn z.b. überhaupt nicht mehr nachvollziehen. Total strange irgendwie. Ich glaub immer noch fest an einen PHP internen Fehler.

              Andi

  2. Hi Andi,

    Manchmal jedoch bricht der Parsevorgang aus unerfindlichen Gründen einfach ab, und zwar ohne jede Fehlermeldung.

    Beim Entwickeln mit PHP hat es sich als sehr nützlich erwiesen, Folgendes an den Anfang jedes Scripts zu schreiben:

      
    error_reporting( E_ALL | ( defined('E_STRICT') ? E_STRICT : 0) );  
    @ini_set('display_startup_errors', TRUE);  
    @ini_set('display_errors', TRUE);  
    @ini_set('html_errors', TRUE);  
    
    

    Möglicherweise tauchen dann doch Fehlermeldungen auf. Und wenn nicht, lohnt sich immer ein Blick ins Error-Log des Webbrowsers -- da steht manchmal was, obwohl das Browserfenster leer bleibt.

    MffG
    EisFuX

    1. Hallo EisFuX.

      Möglicherweise tauchen dann doch Fehlermeldungen auf. Und wenn nicht, lohnt sich immer ein Blick ins Error-Log des Webbrowsers […]

      Du meinst das des Web*servers*, nicht?

      Einen schönen Freitag noch.

      Gruß, Mathias

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
      [HTML Design Constraints: Logical Markup]
      1. Hallo Mathias Brodala,

        Möglicherweise tauchen dann doch Fehlermeldungen auf. Und wenn nicht, lohnt sich immer ein Blick ins Error-Log des Webbrowsers […]

        Du meinst das des Web*servers*, nicht?

        Hoppla -- na klar war der WebSERVER gemeint ...

        MffG
        EisFuX

    2. echo $begrüßung;

      error_reporting( E_ALL | ( defined('E_STRICT') ? E_STRICT : 0) );

      Naja... E_STRICT ist ein bisschen übertrieben. Die meisten Fragesteller schreiben Code der weit davon entfernt ist, von E_STRICT betroffen zu sein. Es reicht schon, wenn E_NOTICE nicht unterdrückt wird.

      echo "$verabschiedung $name";

      1. Hallo dedlfix,

        error_reporting( E_ALL | ( defined('E_STRICT') ? E_STRICT : 0) );
        Naja... E_STRICT ist ein bisschen übertrieben.

        Wenn man Scripts schreiben muss, die sowohl unter PHP4 als auch unter PHP5 laufen müssen, macht sich das ganz gut. Und ohne Grund wurde E_STRICT wohl nicht eingeführt.

        Die meisten Fragesteller schreiben Code der weit davon entfernt ist, von E_STRICT betroffen zu sein. Es reicht schon, wenn E_NOTICE nicht unterdrückt wird.

        Da könntest du allerdings Recht haben ...

        MffG
        EisFuX