[PHP5] flush() Problem

h00ch

Registered User
Hallo,

ich versuche eine Fortschrittsanzeige in einem PHP-Script zu realisieren. Ich bekomme es nicht hin, dass es in Firefox 2.0.0.14 oder IE 7 läuft. Beide Browser warten bis das PHP-Script zu Ende ist und rendern dann erst die Website.

Ich habe verschiedene Lösungsversuche getestet, aber sie scheinen nicht zu funktionieren. Also schreibe ich am besten mal das einfachste Script und ihr helft mir bitte, dass es funktioniert:

Code:
<?php
  echo "1<br />\n";
  flush();
  sleep(10);
  echo "2<br />\n";
?>
Das Resultat soll so aussehen: Der Browser zeigt beim Aufrufen der Website direkt eine 1, nach 10 Sekunden darunter eine 2.
Wenn ihr es hinbekommt, bitte einen Link zu einer Online-Demo, damit ich es mit meinen Browsern testen kann.

MfG, h00ch
 
Last edited by a moderator:

Wildcat

Registered User
Code:
<?php
for ($i=1;$i < 6; ++$i) {
	printf('%d<br />',$i);
	sleep(1);
}
?>
Für das was du willst. Wozu brauchst du da ein flush? Das wird nur verwendet um den
Ausgabepuffer zu leeren. Du verwendest hier aber gar keine gepufferte Ausgabe.
 

h00ch

Registered User
Funktioniert wie zu Erwarten nicht. Die Ausgabe in meinen Browsern kommt erst, wenn alle Zahlen bereits gesendet wurden.

Bitte lade es auf einen Server und bitte poste den Link.

Denn evtl. ist es eine falsche Servereinstellung bei mir oder ein allgemeines Problem mit den Browsern und somit könnten es mehrere Leute testen.
 

Wildcat

Registered User
http://ent.the-wildcat.de/counter.php :rolleyes:

Dann nutzt dein PHP wahrscheinlich output buffering by default.

ob_get_contents() ist dann das Zauberwort ;)

Code:
<?php
for ($i=1;$i < 6; ++$i) {
	printf('%d<br />',$i);
	print ob_get_contents();
	flush();
	sleep(1);
}
?>

Wäre dann wohl für dich zutreffend
 
Last edited by a moderator:

h00ch

Registered User
Auch das funktioniert nicht mit meinen Browsern. Ich benutze sie unter Windows Vista. In Wireshark sehe ich die einzelnen Pakete kommen, aber die Browser rendern erst wenn es komplett ist.

Unter Windows Server 2003 mit IE7 selbes Problem.

Ist das ein bekannter Bug?
 
Last edited by a moderator:

Wildcat

Registered User
Wüsste nicht wieso, bei mir geht es unter Linux, WinXP, Win Server 2003 und Vista ;)
Mit Opera,Firefox und IE8 im IE7 Modus.

Hab mal die sleeptime hochgesetzt, durch die 1 sek sah es im IE8 aus als wäre die Seite sofort fertig.

Konnte es jetzt auf meinem PDA reproduzieren. Immerhin, mal schauen :)
 
Last edited by a moderator:

h00ch

Registered User
Habe jemand anderen testen lassen unter Windows XP SP3 mit dem IE7 und unter Mac 10.4 Tiger mit Safari 3.1: Gleiches Problem wie bei mir.
Ich suche eine Lösung :(
 

Wildcat

Registered User
19.4.6 Introduction of Transfer-Encoding

HTTP/1.1 introduces the Transfer-Encoding header field (section
14.41). Proxies/gateways MUST remove any transfer-coding prior to
forwarding a message via a MIME-compliant protocol.

A process for decoding the "chunked" transfer-coding (section 3.6)
can be represented in pseudo-code as:

length := 0
read chunk-size, chunk-extension (if any) and CRLF
while (chunk-size > 0) {
read chunk-data and CRLF
append chunk-data to entity-body
length := length + chunk-size
read chunk-size and CRLF
}
read entity-header
while (entity-header not empty) {
append entity-header to existing header fields
read entity-header
}
Content-Length := length
Remove "chunked" from Transfer-Encoding
Ich denke das sollte der Teil aus der HTTP 1.1 Spezifikation sein.
Siehe
HTTP 1.1 RFC
HTTP 1.0 RFC

Wenn der Browser o.ä. im 1.0 Modus läuft "kennt" er das (Transfer Encoding) nicht und wartet bis alles da ist (HTTP Response Code) und gibt es dann aus. Das gleiche gilt für Proxys usw. Da sie transfer encoding nicht kennen.

Sorry für die "spärliche" Erklärung. Hab nich das ganze RFC inne ^^ und das ist mir vorher noch gar nicht aufgefallen :)
Wenn jemand eine "genaue" Erklärung schreiben kann, die das detailierter erklärt, dann bitte posten :D
 
Last edited by a moderator:

h00ch

Registered User
Das Log von lighttpd zeigt Folgendes:
Code:
XXX.XXX.XXX.XXX XXX - [26/Jun/2008:09:58:03 +0200] "GET /test.php HTTP/1.1" 200 65 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14"
Auch in about:config ist network.http.version auf 1.1 gestellt. Daran liegt es wohl nicht. Die Browser sind eigentlich in der default-Konfiguration. An was liegt es sonst?
 

Wildcat

Registered User
Also das hat nix zu sagen, der IE8 macht auch einen HTTP 1.1 request wenn 1.1 deaktiviert ist. Er Interpretiert die Antwort dann nur nach RFC 1945 .

Wenn ich firefox 3 auf 1.0 umstelle funktioniert es dennoch. Kommt halt auf die jeweilige Implementierung an. Jeder weiß das die nicht immer RFC konform sind und selbst wenn, noch "unterschiedlich funktionieren". Auf jeden fall hängt es mit dem oben genannten transfer encoding zusammen.

Hier noch der Wikibeitrag. Firefox 2 gerade zum testen installiert. Dort geht es bei mir auch. Kann ich dir auch nicht mehr helfen xD

Du nutzt aber nicht *zufällig* einen Proxyserver, welcher eventuell daran schuld sein könnte? Wenn ich WebScarab von Owasp verwende, habe ich z.B. das gleiche phänomen.
 
Last edited by a moderator:

h00ch

Registered User
Auf einem PC mit Windows XP SP3 und Firefox 2.0.0.14 klappts auch bei mir, jedoch nicht mit dem IE 6 auf der selben Installation. Wenn jemand weiss, welche Einstellung, Programm, etc. dafür verantwortlich ist, bitte melden.
 

Wildcat

Registered User
Mozilla Europa-Chef: 'Stirb Internet Explorer 6, stirb!'
Das sehe ich genauso, der Browser ist eine Krankheit und kann nix :D .
Aber, ... ist denn in den Einstellungen unter Extras -> Internetoptionen -> Erweitert -> "Einstellungen für http 1.1" der Haken unter HTTP 1.1 verwenden gesetzt? :D

Und dann gibt es natürlich noch die Möglichkeit das der Internet Explorer 6 das nicht unterstützt.
 

h00ch

Registered User
Wie schon gesagt: Mit Mozilla Firefox 2.0.0.14 auf Windows Vista SP1 klappts auch nicht :(
Aber ja, "Use HTTP 1.1" ist im IE 6 aktiviert.
 

Wildcat

Registered User
Was ich noch herausgefunden hab:

Netwerkumgebung -> Netzwerverbindung -> Eigenschaften

Wenn dort TCP/IP Version 6 installiert ist, mal deinstallieren. Sorgte unter XP bei mir dafür, das es im IE8 so ist wie bei dir im IE6 allerdings im Firefox ging. Wäre noch ein Ansatz. Oder an sich Netzwerktreiber oder Monitoringtreiber für irgendwelche tools, die die Daten vorher noch in irgendeiner weise verändern.
 

h00ch

Registered User
Da ich eine Progressbar scripten will, ist das leider keine Lösung, denn es müsste ja bei allen Usern laufen. Wenn ich server-seitig nichts ändern kann, muss ich mir wohl etwas andere einfallen lassen. Wer das Problem genau lokalisieren kann, bitte melden.
 

Wildcat

Registered User
Einfach Javascript benutzen :p weil mit php kannst du eh keine ordentliche Progressbar bauen ^^
Oder Java oder flash oder oder oder. Eben etwas Clientseitiges.

Und wenn dir die Problemspezifikation noch nicht geholfen hat, dann kann ich dir und auch kein anderer mehr helfen. Was ist denn jetzt so schwer daran zu verstehen das das Problem beim header transfer encoding besteht und mit der Implementierung des TCP/IP stacks sowie der Implementierung des HTTP protokolls zusammenhängt. :rolleyes: Und eben erst ab HTTP 1.1 vorhanden ist. Was nicht bedeutet das es automatisch funktioniert wenn HTTP 1.1 vorhanden ist.

Du wirst auch keine serverseitige Lösung dafür finden, so wie es für viele andere dinge keine serverseitige Lösung gibt.
 
Last edited by a moderator:

h00ch

Registered User
Wie sollte das mit Javascript gehen? Das PHP-Script kann ja keinen Status senden, wenn kein chunked transfer encoding geht.
 

Top