Bildschirmausgabe vor ausführen von Berechnungen?

Don Stefano

Erfahrenes Mitglied
Hallo zusammen,

ich sitze nun schon stundenlang an einem kleinen Problemchen, für das es doch eine Lösung geben muss. Ich kann sie aber nicht finden.

Ich habe ein Skript, welches einige Berechnungen anstellt und daher auch einige Sekunden Zeit benötigt. Nun möchte ich gern folgendes realisieren:

Bei Aufruf einer Seite index.php leitet diese unter bestimmten Umständen auf die Seite auswertung.php weiter.

Ich möchte nun, dass bevor die Auswertung beginnt, ein Text ausgegeben wird, etwa "Bitte einen Moment Geduld..." und danach erst die Berechnungen starten.

Mein Skript verhält sich aber immer so, dass es erst die Berechnungen anstellt, bevor es die Bildschirmausgabe macht. In anderen Worten: Der Wartehinweis erscheint erst, nachdem das Warten auf die Berechnungen abgeschlossen ist, obwohl der Echo-Befehl über den Berechnungen steht.

Offensichtlich wird Echo aber erst ausgeführt, wenn das gesamte Skript abgearbeitet ist. Wie kann man das umgehen? Es gibt doch bestimmt eine Möglichkeit oder?

Vielen Dank!
 
Nun ja, PHP berechnet erst die GESAMTE Ausgabe SERVERSEITIG, also erhältst du keine Ausgabe, bevor alles abgearbeitet ist.
birnkammer hat gesagt.:
Ja, das ist eine Möglichkeit.
Nur funktioniert sie nicht bei jedem Browser und ich weiß nicht, was für Faktoren da eine Rolle spielen.
Jedenfalls ist das nicht unbedingt optimal ...

Ich weiß nicht, ob du da was mit Javascript machen könntest, davon hab ich keine (wenig) Ahnung. Vielleicht würde man da sogar Ajax benötigen, da hab ich aber noch weniger Ahnung von :rolleyes:
Also lass ich mal das Vermutungen aufstellen ... Jedenfalls ist es mit PHP nicht sauber lösbar.
 
flush() hat mit dem Browser nichts zu tun.

Es könnte sein, dass ein Browser die Seite erst anzeigt, wenn sie komplett geladen ist. Ich kenne aber keinen Browser, der das macht und das wäre auch sehr ungewöhnlich.
Und wenn es tatsächlich so schon nicht geht, dann gehts wahrscheinlich mit JavaScript/Ajax noch weniger.

Ich denke schon, dass flush hier die optimale Lösung ist.
 
aruba-x-x hat gesagt.:
flush() hat mit dem Browser nichts zu tun.

Es könnte sein, dass ein Browser die Seite erst anzeigt, wenn sie komplett geladen ist. Ich kenne aber keinen Browser, der das macht und das wäre auch sehr ungewöhnlich.
Und wenn es tatsächlich so schon nicht geht, dann gehts wahrscheinlich mit JavaScript/Ajax noch weniger.

Ich denke schon, dass flush hier die optimale Lösung ist.
Ich hab schonmal einen Chat mit flush() realisiert :D nur so aus langeweile ...
Ich hab halt etwas damit rumgespielt, dabei ist mir aufgefallen, dass nicht alles immer mit jedem Browser ging.
Btw:
php.net hat gesagt.:
Dabei wird versucht den ganzen Inhalt an den Browser des Benutzers zu schicken.

Ich erinnere mich auch gehört zu haben, dass das nicht mit jedem Browser geht.
Vorallem bei Browsern, die ohne eine GUI arbeiten (also als Konsole - Bei Linux vielleicht des öfteren im Einsatz) könnte ich mir vorstellen, dass das nicht geht.

Bei Javascript wäre das übrigens das Selbe ... Nicht jeder hat Javascript aktiviert.
Vielleicht kann uns ja jemand Näheres zu flush() sagen - Vielleicht ist es ja doch die beste Möglichkeit.
 
Vielen Dank erst einmal für den Hinweis.

Aber wie muss ich flush() verwenden? Für mein Beispiel einfach hinter den Teil, der zuerst ausgegeben werden muss, flush() schreiben? Ist das schon alles?

Und dann wird danach der Rest abgearbeitet? Der Link ist für einen Laien mal wieder nicht so sonderlich aussagekräftig - aber ich werde es gleich einmal ausprobieren.
 
@Irgendjemand_1:
Ich hab auch schonmal das Grundgerüst für einen HTML-Client erstellt (mittels Page-Streaming), dieser hat mit flush() wunderbar funktioniert.
Wenn der Browser nichts darstellt, solange nicht die ganze Seite geladen wurde, dann kann man nichts machen.

Dass laut php.net nur "versucht" wird, den Inhalt des Ausgabepuffers zu senden, spielt doch hier keine Rolle...
Wenn man flush nicht aufruft, wird nach Abarbeitung des Skripts auch nur "versucht" die Ausgabe zu senden.

@Don
Ja, einfach flush() nach echo aufrufen.
 
Leider bewirkt das gar nichts. Alles wie gehabt.

Hier mal der relativ kurze Code des Skriptes. Das was ausgegeben werden soll ist allerdings schon etwas mehr als nur ein "Echo-Befehl". Ich dachte jedoch, dass würde keine Rolle spielen.

Jedenfalls soll alles bis kurz vor Ende der ersten IF-Abfrage ausgegeben werden, bevor dann "include ("auswertung.php");" ausgeführt wird. Ich habe die Stelle im folgenden Code markiert.

PHP:
<?php
//Session pruefen
require("functions/testeSession.php");

//wenn erfolgreicher Login, dann Layoutdatei laden 
include ("layout/header_vorgabe.php");  

$ende = $_GET["ende"];

echo "<h1 class=\"oben\"><img src=\"rechts.gif\"> Testdurchf&uuml;hrung beendet </h1>";  

IF ($ende !=1) {

echo'
<table width="500" cellspacing="10" id="table6">
<tr>
<td> <small><strong>Einen Moment Geduld bitte...</strong> <br><br> </td></tr>
<tr>
<td style="text-align: center;"><img  src="layout/loading4.gif"><br><br> 
  </td>  
 </tr>
 </table>
 <p><br></p>';
 
//hier wird die Layoutvorlage eingebunden
include ("layout/footer_vorgabe.php");

//****************************ALLES BIS HIERHER SOLL NUN AUSGEGEBEN WERDEN************** 
//*******FLUSH () AN DIESER STELLE BEWIRKT ABER NICHTS********


//Jetzt wird die Datei includet, die etwa 5 Sekunden rechnet
include ("auswertung.php");

//Danach dieses Skript neu laden
header('Location: ende_alles.php?ende=1') ; 

} //Ende IF
 


IF ($ende ==1) {

echo'
<table width="500" cellspacing="10" id="table6">
<tr>
<td><small><strong>Sie haben s&auml;mtliche Testbereiche absolviert!</strong></td>
</tr>
<tr><td ><small>Ihre Ergebnisse wurden erfolgreich gespeichert. <br> <br>Vielen Dank f&uuml;r Ihre Teilnahme. Bitte loggen Sie sich nun &uuml;ber den Logoutbutton aus. <br><br>
  </td>  
 </tr>
 </table>
<p><br></p>';
//hier wird die Layoutvorlage eingebunden
include ("layout/footer_vorgabe.php");

} //Ende IF


?>
Wer weiß wie es gehen könnte?
 
Irgendjemand_1 hat gesagt.:
Ich erinnere mich auch gehört zu haben, dass das nicht mit jedem Browser geht.
Vorallem bei Browsern, die ohne eine GUI arbeiten (also als Konsole - Bei Linux vielleicht des öfteren im Einsatz) könnte ich mir vorstellen, dass das nicht geht.
Manche Browser – beispielsweise der Internet Explorer – stellen eine Tabelle erst dann dar, wenn sie komplett gesendet wurde bzw. die Größe der Tabelle bekannt ist. Der Konsolenbrowser Lynx stellt die gesamte Seite erst dann dar, wenn sie komplett gesendet wurde.

Ob beim Aufruf von [phpf]flush[/phpf] die bisherigen Ausgaben tatsächlich zum Client geschickt werden, hängt hauptsächlich von der PHP-Konfiguration und der des verwendeten Webservers ab:

Steht die PHP-Direktive output_buffering auf der standardmäßigen Einstellung 4096, so werden jeweils vier Kilobyte der Ausgabe gepuffert und erst dann ausgegeben. Dies kann man allerdings umgehen, indem man am Anfang des Skripts [phpf]ob_end_flush[/phpf] aufruft und somit dieses Verhalten ausschaltet. Um sämtliche Puffer zu eliminieren, könnte man beispiel folgende Zeile verwenden:
PHP:
while (ob_get_level() > 0) ob_end_flush();

Dies verschafft aber leider keine Abhilfe, wenn der Webserver zusätzlich die Daten puffert (z.b. bei Apache mit mod_gzip). Hier sollte man natürlich die entsprechenden Module deaktivieren, um das Abschicken der Daten zum Client ohne Zeitverzögerung zu ermöglichen.

Grüße,
Matthias
 
Zurück