Stefan: Timing der HTML Ausgabe

Hallo,
ich lasse ein Perl Script laufen, welches Dateien durchsucht und XML files auf dem Server generiert. Ausserdem soll es dann auch eine HTML Seite mit Statusinformationen an den Browser senden, auch um dem User zu zeigen, dass der Server was tut.
Also so:

  1. File 1 oeffnen
  2. Meldung an Browser: File 1 geoeffnet
  3. Daten suchen
  4. Meldung an Browser: Daten gefunden
  5. File 2 oeffnen
  6. Meldung an Browser: File 2 geoeffnet
    usw.
    Leider passiert das folgende:
  7. File 1 oeffnen
  8. Daten suchen
  9. File 2 oeffnen
  10. Meldung an Browser: File 1 geoeffnet
  11. Meldung an Browser: Daten gefunden
  12. Meldung an Browser: File 2 geoeffnet
    usw.
    Es ist also so, dass erst das ganze Dateihandling durchgefuehrt wird und am Ende die HTML Seite geladen wird.
    Versteht Ihr was ich meine???
    Ich mache alle Ausgeban mit "print" und schalte dafuer vor jedem Wechsel zw. File und Browser mit "select" zw. MYFILEHANDLE und STDOUT hin und her.
    Warum passieren die Browser "prints" nicht chronologisch?
    (Je nach Art meines Scripts und des HTML codes werden manchmal Teile der HTML-Seite auch schon zwischendurch geschrieben, nur habe ich eben keinen Einfluss darauf, wann das passiert...)
    Danke fuer Eure Hilfe,
    Stefan
  1. Sup!

    Hmmm... bei PERL muß man dann die Ausgabe "ungepuffert" (unbuffered) machen bzw. flushen.
    Sonst wartet das Skript, bis "genug" Ausgabe da ist, bzw. bis zu seinem Ende mit dem rausschreiben der Ausgabe zum Browser.
    Vielleicht ist das bei PHP auch so?

    Gruesse,

    Bio

    1. Hmmm... bei PERL muß man dann die Ausgabe "ungepuffert" (unbuffered) machen bzw. flushen.

      Geht es hier nicht um Perl?

      Setzte
      $| = 1;
      dann ist die Pufferung ausgeschaltet (der Langname dieser Variablen heißt $OUTPUT_AUTOFLUSH).

      Gruß Frank

      1. Hi Frank,

        Geht es hier nicht um Perl?
        Setzte
        $| = 1;
        dann ist die Pufferung ausgeschaltet (der Langname
        dieser Variablen heißt $OUTPUT_AUTOFLUSH).

        aber ob dann der Webserver selbst auch noch puffert (beim Einsatz von mod_gzip für dynamische Ausgaben täte er das beispielsweise), das steht auf einem anderen Blatt.

        Viele Grüße
              Michael

  2. Hi,

    ich lasse ein Perl Script laufen, welches Dateien durchsucht und XML files auf dem Server generiert. Ausserdem soll es dann auch eine HTML Seite mit Statusinformationen an den Browser senden, auch um dem User zu zeigen, dass der Server was tut.

    Also so:

    1. File 1 oeffnen
    2. Meldung an Browser: File 1 geoeffnet
    3. Daten suchen
    4. Meldung an Browser: Daten gefunden
    5. File 2 oeffnen
    6. Meldung an Browser: File 2 geoeffnet
      usw.
      Leider passiert das folgende:
    7. File 1 oeffnen
    8. Daten suchen
    9. File 2 oeffnen
    10. Meldung an Browser: File 1 geoeffnet
    11. Meldung an Browser: Daten gefunden
    12. Meldung an Browser: File 2 geoeffnet
      usw.

    Es ist also so, dass erst das ganze Dateihandling durchgefuehrt wird und am Ende die HTML Seite geladen wird.
    Versteht Ihr was ich meine???
    Ich mache alle Ausgeban mit "print" und schalte dafuer vor jedem Wechsel zw. File und Browser mit "select" zw. MYFILEHANDLE und STDOUT hin und her.
    Warum passieren die Browser "prints" nicht chronologisch?

    • Wie sollen wir das ohne Kenntnis des Scripts wissen?
    • Finden die prints vielleicht nicht in der Reihenfolge oder zu den Zeitpunkten statt, die Du annimmst?
    • Ist die Ausgabe des Scripts vielleicht gepuffert?

    (Je nach Art meines Scripts und des HTML codes werden manchmal Teile der HTML-Seite auch schon zwischendurch geschrieben, nur habe ich eben keinen Einfluss darauf, wann das passiert...)

    Richtig erkannt. Es ist nicht garantiert, daß der Browser die Seite häppchenweise bekommt.
    Ein einziger Proxy dazwischen, der die Seite erst weiterreicht, wenn sie vollständig ist, und schon ist der ganze Effekt weg...
    Außerdem gibt es Browser, die erst dann anfangen, die Seite darzustellen, wenn sie entweder komplett ist oder eine gewisse Mindestmenge an Daten angekommen ist...

    Andreas