Supportnet / Forum / Skripte(PHP,ASP,Perl...)
Pufferung vom Server abschalten
Frage
Hallo
Ich habe unter Win98 einen kleinen Apache-Server (Ver. 1.3.24) aufgesetzt und zudem perl und mysql installiert. Jetzt wollte ich testen, ob ein Perl-Skript gepuffert wird oder nicht, bevor es der Server an den Client sendet. Ein Beispiel-Skript sieht z.B. so aus:
#!perl -wT
use strict;
print "$ENV{SERVER_PROTOKOL} 200 OK\n";
print "Server: $ENV{SERVER_SOFTWARE}\n";
print "Content-type: text/html\n\n";
print "OK, beginne zeitintensive Verarbeitung ... \n";
# Die Ausgabepufferung von Perl abschalten
$| = 1;
for ( my $loop = 1; $loop <= 5; $loop++ ) {
print "Schleifendurchlauf: $loop\n";
# hier wird eine Zeitintensive Aufgabe bearbeitet
sleep 1;
}
print "Fertig!\n";
---------------------------
Mit dem Befehl $| = 1 wird die Pufferung von Perl abgeschaltet. Wieso werden die einzelnen Zeilen der Schleife jedoch erst nach den abgelaufenen 5sec. angezeigt und nicht wie gewünscht sofort?
Ich hoffe ihr konntet das jetzt verstehen, ansonsten fragt nochmal nach.
thx
Guido
Antwort 1 von florian99
das liegt an der perl-umsetzung für windows. versuchs mal unter unix da funzt es
Antwort 2 von MixMax
versuche mal den befehl
flush();
flush();
Antwort 3 von semi
Muss man die Pufferung nicht vor der ersten Ausgabe (auch vor dem Header)
deaktivieren, damit es eine Wirkung hat?
Ich sehe das ganze wie folgt:
Der Header wird in Deinem Beispiel gepuffert, alles nach $| = 1; "nicht mehr".
Da der Server aber zuerst den Header schicken muss, hat das Ausschalten der Pufferung keine Wirkung und alles wird gepuffert.
Oder sehe ich es falsch?
deaktivieren, damit es eine Wirkung hat?
Ich sehe das ganze wie folgt:
Der Header wird in Deinem Beispiel gepuffert, alles nach $| = 1; "nicht mehr".
Da der Server aber zuerst den Header schicken muss, hat das Ausschalten der Pufferung keine Wirkung und alles wird gepuffert.
Oder sehe ich es falsch?
Antwort 4 von Kwirly
@MixMax:
Kannst du mir das mit flush(); noch etwas genauer erklären? Denn alles was nach diesem Befehl ausgegeben werden soll, wird nicht angezeigt.
@semi:
Alos bei mir machte es irgendwie keinen Unterschied, ob ich diese Zeile vor oder nach dem Header stehen hatte. Ich habe auch mal die ersten zwei Header entfernt. Da hat sich auch nix getan.
Kannst du mir das mit flush(); noch etwas genauer erklären? Denn alles was nach diesem Befehl ausgegeben werden soll, wird nicht angezeigt.
@semi:
Alos bei mir machte es irgendwie keinen Unterschied, ob ich diese Zeile vor oder nach dem Header stehen hatte. Ich habe auch mal die ersten zwei Header entfernt. Da hat sich auch nix getan.
Antwort 5 von Kwirly
Hat keiner einen Tip für mich?

