warum funktioniert in schleifen kein echo ?

RpaToR

Grünschnabel
-

Hallo,
ich bin nicht so der Profi in PHP , aber eines hat mich doch gewundert :

Code:
<?
for ($i=0; $i<10; $i++)  {
  sleep(1);
  echo $i." - ";
}
?>
Normal müsste doch nach jeder Sekunde $i mittels echo-Befehl ausgegeben werden. Aber nichts ist, man wartet 10 Sekunden und dann werden alle "echo-Befehle" auf einmal herausgegeben.

Gibt es eine Möglichkeit während des abarbeitens einer for-Schleife oder while-Schleife den echo-Befehl auszugeben?

gruss RapToR

-
 
Nein,das geht nicht. PHP ist ja eine serverseitige Sprache, da kann also nicht ein teil bearbeitet werden, dann ein wenig HTTP Output geschickt werden, dann wieder was gerechnet werden und dann wieder Output geschickt werden.

Ein Script läuft immer ganz durch und dann kommt alles fertig an den Client! Das sleep ist eher dafür da, wenn man andere Dinge im Hintergrund macht und etwas Zeit haben möchte, zB immer wieder eine Datenbankanfrage die Zeit braucht oder was in die Richtung.
 
Hi.

Naja.. hat eher was mit dem Ausgabebuffer zu tun.
Wird wohl so eingestellt sein, das PHP alles zwischenbuffert bis das komplette Skript abgelaufen ist.

Mittels [phpf]ob_flush[/phpf] kannst den momentanen Buffer an den Client schicken.
In deinem Fall solltest das gleich nach dem echo schreiben.

lg,
Alex

Edit:
Habs mal ausgetestet, auf meinem Server funktioniert es nicht, auf dem von einem Freund schon. Wird mit den PHP Einstellungen zusammenhängen, und es könnt auch noch unterschiede bei den Browsern geben. Je nachdem wann die damit beginnen Elemente darzustellen, und dergleichen. Najo, war mal wieder nen Ausflug ins PHP Forum von mir. *g*
 
Du kannst mit flush() arbeiten.
Die Ausgabe von einzelnen Teilen bevor das gesamte Dokument angekommen ist wird aber, nach meiner Erfahrung, nicht von allen Browsern unterstuetzt.
 
-

Thx erstmal. Das "ob_flush" oder "flush" wäre eine schöne Sache gewesen, aber sie funktioniert bei mir (Apache2 Server, PHP5) leider auch nicht.

Ich hab eine neue Idee und auch eine Frage wie es vielleicht doch klappen könnte, und zwar mit zwei PHP-Dateien die beide gleichzeitig aufgerufen werden, z.B. durch eine Mehrframe-Seite.

Code:
<!-- Datei eins (Frame 1) -->
<?
for ($i=0; $i<10; $i++) {
  sleep(1);
  // echo $i." - ";
  --> schreibe Wert von $i in einer Datei "file.txt" oder in die MySQL-Datenbank
}
?>
<!-- Datei eins ende -->
Code:
<!-- Datei zwei (Frame 2) -->
<?
  --> lese Wert von $i aus einer Datei "file.txt" oder von der MySQL-Datenbank
  if ($i<10) {
    sleep(1);
    echo $i." - ";
    echo "<script LANGUAGE=\"JavaScript\">window.open(\"DateiZwei.php\", \"_self\");</script>";
  }
}
?>
<!-- Datei zwei ende -->
Das Script aus Seite 2 liest $i aus einer Quelle vom Server raus und gibt $i dann aus. Die Seite lädt dann anschliessend fertig. Mit der JS-Zeile ruft es sich dann immer Clientseitig wieder neu auf.

Meine Frage: gibt es noch andere Serverseitige Quellen wie Datenbank oder Datei, auf die mehrere PHP-Scripte gleichzeitig zugreifen können? Am besten wäre etwas, was das Ram benutzt, etwa sowas wie ein Ram-Device in dem man Variablen oder ähnliches schreiben kann.

Bei der Datenbank scheint es ja längere Zugriffszeiten zugeben. Und fortwährend in einer Datei zuschreiben, das dürfte die CPU serverseitig ganz schön belasten.

RapToR
-
 
Zuletzt bearbeitet:
RpaToR hat gesagt.:
Thx erstmal. Das "ob_flush" oder "flush" wäre eine schöne Sache gewesen, aber sie funktioniert bei mir (Apache2 Server, PHP5) leider auch nicht.
Bei mir klappt flush() oder ob_flush() auch nicht einzeln.

Aber so gings bei mir dann:
PHP:
<?php
for ($i = 1; $i <= 10; $i++) {
    echo $i."<br>";
    ob_get_contents();
    ob_flush();
    flush();
    sleep(1);
}
?>
Vielleicht bei dir auch.

Edit: Im IE geht's aber jedenfalls nicht ;) Hab's ansonsten nur mit FF getestet
 
Hi,

wenn Du eh kein Problem damit hast, JavaScript zu verwenden, kannst Du doch einfach die Ausgabe aus der Schleife in ein JS-Array schreiben, welches Du auf dem Client per setInterval oder setTimeout nacheinander anzeigst. Käme jedenfalls ohne Reload aus.

Gruß
.
 
-

hey "Irgendjemand_1" ,genauso hab ich es gemeint. Deine Scriptzeilen funktionieren bei mir auch, aber leider nur mit FireFox. Ich bräuchte da etwas, was mit allen Browsern geht .

@Datic, jo haste recht, aber erstmal bräuchte ich eine Lösung wie ich $i von Script 1 an Script 2 übergeben kann und das in einer schnellen Frequenz. Vielleicht ist die Übergabe mittels SQL doch die beste, bzw. die einzige mögliche.

-
 
Zuletzt bearbeitet:
RpaToR hat gesagt.:
hey "Irgendjemand_1" ,genauso hab ich es gemeint. Deine Scriptzeilen funktionieren bei mir auch, aber leider nur mit FireFox. Ich bräuchte da etwas, was mit allen Browsern geht
Hmm bei mir geht das auch nicht mit dem IE
Aber das merkwürdige:
Ich hab mir daraus mal einen kleinen Chat mit Textdatein gebaut (mir war langweilig :D)
und das ging auch im IE.
War genau das selbe Prinzip, nur hat er eben Zeilen aus einer Textdatei, anstatt $i ausgegeben.
Hat jedenfalls in Opera, FF und IE funktioniert

RpaToR hat gesagt.:
-@Datic, jo haste recht, aber erstmal bräuchte ich eine Lösung wie ich $i von Script 1 an Script 2 übergeben kann und das in einer schnellen Frequenz. Vielleicht ist die Übergabe mittels SQL doch die beste.
Würde ich jetzt auch mal so behaupten, vielleicht gibt's ja bessere Lösungen, aber das sollte schnell genug sein
 
Zurück