Stefan: flush(), sleep() funktioniert nicht wie es sollte

Hallo @all !

Hab ein kleines "Problemchen" mit folgendem, einfachen PHP Code. Also Beispiel hier der Code aus dem PHP Buch zum Befehl "sleep()".

<?PHP
echo "Selfphp<br>";
echo "Diese und die nächste Zeile werden auch noch an den Browser gesendet.<br>";
echo "Jetzt passiert 3 Sekunden gar nichts.<br>";
flush();
sleep(3);
echo "<br>";
echo "Die 3 Sekunden sind vorbei und erst jetzt<br>";
echo "wird dieser Text ausgegeben.";
?>

Also normalerweise sollte ja erst Zeile 1,2 & 3 ausgegeben werden, dann sollte normalerweise 3 Sekunden Pause sein und dann sollten die letzten Zeilen ausgegeben werden.
Nun, leider ist dem nicht so ... aber WIESO!? Der Code wirst erst nach 3 Sekunden komplett dann ausgeführt, sprich 3 Sekunden lädt das Script, dann wird es komplett ausgegeben.
Ich hoffe, mir kann jemand helfen ...

Mit freundlichen Grüssen
Stefan

  1. Moin!

    Also normalerweise sollte ja erst Zeile 1,2 & 3 ausgegeben werden, dann sollte normalerweise 3 Sekunden Pause sein und dann sollten die letzten Zeilen ausgegeben werden.
    Nun, leider ist dem nicht so ... aber WIESO!? Der Code wirst erst nach 3 Sekunden komplett dann ausgeführt, sprich 3 Sekunden lädt das Script, dann wird es komplett ausgegeben.

    Die Ausgabe an den Browser wird gepuffert. Der Puffer kriegt nach dem Start des Skripts sofort die ersten drei Zeilen, und nach 3 Sekunden den Rest reingeschrieben. Dann endet das Skript, und der Puffer wird an den Browser geschicht... das Ergebnis ist bekannt.

    Deshalb ist die mögliche Lösung, einfach die Pufferung auszuschalten. Ich hab keinen blassen Schimmer, wie man das machen könnte in PHP, aber wenn du danach mal etwas suchst, findest du sicher was. :)

    - Sven Rautenberg

    1. Hei Sven!

      Naja, für die Pufferung is ja der Befehl "flush()" da, der den Ausgabepuffer löscht ... ohne diese Angabe ist normalerweise das Ergebnis der Ausgabe so, wie es bei mir ist - was es aba ja normal nicht sein sollte, da ich ja die Angabe gemacht habe :(

      1. Hei Sven!

        Yo!

        Naja, für die Pufferung is ja der Befehl "flush()" da, der den Ausgabepuffer löscht ... ohne diese Angabe ist normalerweise das Ergebnis der Ausgabe so, wie es bei mir ist - was es aba ja normal nicht sein sollte, da ich ja die Angabe gemacht habe :(

        Dann gibts eben "den PHP-Puffer" (auf den Flush wirkt) und "irgendeinen anderen Puffer", der die ganze Ausgabe nochmal aufhält. Das können z.B. Web- oder Proxyserver sein. Oder auch der Browser selbst. Tabellen werden ja bekanntlich nur am Stück angezeigt - um nur ein Beispiel zu nennen. Netscape 4 ist AFAIK (hatte mal selbst mit Perl einen Fortschrittsbalken geschrieben) etwas störrisch - IE hab ich nicht getestet damals.

        - Sven Rautenberg

        1. Moin,

          Dann gibts eben "den PHP-Puffer" (auf den Flush wirkt) und "irgendeinen anderen Puffer", der die ganze Ausgabe nochmal aufhält. Das können z.B. Web- oder Proxyserver sein. Oder auch der Browser selbst. Tabellen werden ja bekanntlich nur am Stück angezeigt - um nur ein Beispiel zu nennen. Netscape 4 ist AFAIK (hatte mal selbst mit Perl einen Fortschrittsbalken geschrieben) etwas störrisch - IE hab ich nicht getestet damals.

          Genau der Browser wird schuld sein. Mit Mozilla müsste der Code beispielweise funktionieren, mit Netscape 4 nicht. Letzterer puffert wirklich ganz gerne mal, was ich ebenfalls bei der Programmierung eines Fortschrittsbalkens bemerkt habe. Ich bin mir nicht ganz sicher, aber ich glaube es reicht an jede Zeile einen Zeilenumbruch (also ein \n innerhalb des Strings) anzuhängen. Ansonsten benutz einfach einen anderen Browser oder führ das Skript mal auf der Kommandozeile mit der PHP-CGI-Version aus.
          Es funktioniert auf jeden Fall, davon kannst du dich notfall mit einem Packet Sniffer überzeugen.

          --
          Henryk Plötz
          Grüße von der Ostsee