flush
jepetko
- php
0 Andreas Görtz0 Chris
Hallo,
ich hätte eine Frage zu PHP und zwar: ich führe mit PHP zeitaufwendige Rechenaufgaben durch. Dabei möchte ich aber dem Client noch während der Rechenzeit irgendwie Bescheid geben, dass ich noch rechne. Das habe ich zunächst so gelöst, dass ich noch vor dem kritischen Codestück declare(ticks=180) gesetzt habe. Danach kommt eben eine Schleife, die bei jedem Durchlauf einen String erzeugt und in einer globalen Variablen zwischenspeichert. Nach 180 Ticks soll jedes Mal (automatisch) dieser Puffer geleert werden. Das geschieht in einer mit register_tick_function registrierten Funktion. Dort habe ich natürlich auch einen flush(). Die Ausgabe wird jedoch nicht in mehreren Schritten an den Client geschickt, sondern erfolgt erst ganz am Ende, wenn quasi die ganze Rechenarbeit fertig ist. Das mit den Ticks funktioniert einwandfrei, d.h. nach 180 Ticks wird tatsächlich die "print"-Funktion aufgerufen, doch die "tatsächliche" Ausgabe (d.h. wann ich was auf dem Bildschirm zu sehen bekomme) erfolgt aufeinmal - wenn die Schleife fertig ist. Kann mir jemand ein Paar Tips geben, wie ich laufend eine Ausgabe an Clients schicken kann, obwohl das Script noch rechnet?
Vielen Dank für Eure Vorschläge.
jepetko
Hi,
Kann mir jemand ein Paar Tips geben, wie ich laufend eine Ausgabe an Clients schicken kann, obwohl das Script noch rechnet?
Das flush() nicht wie gewünscht arbeitet kann verschiedene Ursachen haben. Manche Webserver puffern trotzdem, manche Apache-Module steuern die Pufferung selbst, manche Browser haben ihre Eigenarten, erwarten z.B. mindestens 256 Byte, bevor sie etwas ausgeben, u.v.m...
Auf meinem System (Apache2 auf Win2000) passiert bei Aufruf von flush() oder ob_flush() übrigens auch nichts - aber die Kombination von beiden arbeitet wie gewünscht, also z.B.:
<?php
$i = 10;
while ($i > 0)
{
echo $i--;
flush();
ob_flush();
sleep(1);
}
?>
Falls das nicht hilft, auf welchem System arbeitest du denn?
Gruß,
Andreas.
Hallo !
Danke für eure Antworten.
Es handelt sich um einen NT-Rechner mit IIS und PHP5 drauf.
Ich probiere ich die Kombination von flush und ob_flush aus....
lg
jepetko
Hi,
Kann mir jemand ein Paar Tips geben, wie ich laufend eine Ausgabe an Clients schicken kann, obwohl das Script noch rechnet?
Das flush() nicht wie gewünscht arbeitet kann verschiedene Ursachen haben. Manche Webserver puffern trotzdem, manche Apache-Module steuern die Pufferung selbst, manche Browser haben ihre Eigenarten, erwarten z.B. mindestens 256 Byte, bevor sie etwas ausgeben, u.v.m...
Auf meinem System (Apache2 auf Win2000) passiert bei Aufruf von flush() oder ob_flush() übrigens auch nichts - aber die Kombination von beiden arbeitet wie gewünscht, also z.B.:
<?php
$i = 10;
while ($i > 0)
{
echo $i--;
flush();
ob_flush();
sleep(1);
}?>
Falls das nicht hilft, auf welchem System arbeitest du denn?
Gruß,
Andreas.
hi,
die Kombination von flush und ob_flush hat auch nichts genutzt.
Es wird mir nichts anderes übrig bleiben als mir irgendeine Art von Progressbar einfallen zu lassen - blöd.
Komisch ist nur, dass ich vorher eine kurze Meldung ausgebe. Die erscheint sofort und dann beginnt die Schleife zu laufen. Dann beginnt das eigentliche Problem. Der Client ist tot, kein blauer Balken unten in der Leiste oder sowas, was drauf hinweisen würden, dass das Programm noch ausgeführt wird. Also man glaubt, dass die Seite schon fertig geladen ist. Und erst nach 5 Minuten erscheint der ganze Content.
jepetko
Hi,
Kann mir jemand ein Paar Tips geben, wie ich laufend eine Ausgabe an Clients schicken kann, obwohl das Script noch rechnet?
Das flush() nicht wie gewünscht arbeitet kann verschiedene Ursachen haben. Manche Webserver puffern trotzdem, manche Apache-Module steuern die Pufferung selbst, manche Browser haben ihre Eigenarten, erwarten z.B. mindestens 256 Byte, bevor sie etwas ausgeben, u.v.m...
Auf meinem System (Apache2 auf Win2000) passiert bei Aufruf von flush() oder ob_flush() übrigens auch nichts - aber die Kombination von beiden arbeitet wie gewünscht, also z.B.:
<?php
$i = 10;
while ($i > 0)
{
echo $i--;
flush();
ob_flush();
sleep(1);
}?>
Falls das nicht hilft, auf welchem System arbeitest du denn?
Gruß,
Andreas.
Selber Hallo,
das mag vom OS abhängen.
Bei Windows nicht viel Chance auf eine nachvollziehbare Ausführung.
Soweit ich weiß, funktioniert es bei Linux, solange man noch keinen header gestzt hat. Musst Du mal nach 'flush()' und 'Tom' oder 'Dennis' im Archiv suchen. Tom und Dennis haben das schon ziemlich auseinandergenommen und beschrieben, was so passiert.
LG
Chris