Problem mit Sleep() -> funktioniert falsch
Adrian
- php
Hallo alle miteinander!
Das Problem:
<?PHP
echo "Selfphp<br>\n";
echo "Diese und die nächste Zeile werden auch noch an den Browser gesendet.<br>\n";
echo "Jetzt passiert 3 Sekunden gar nichts.<br>\n";
flush();
sleep(3);
echo "<br>\n";
echo "Die 3 Sekunden sind vorbei und erst jetzt<br>";echo "wird dieser Text ausgegeben.\n";
?>
Es sollte also der erste Teil sofort und der Zweite nach 3 sekunden ausgegeben werden!
JEdoch wird das gesammte Script erst nach 3 Sekunden ausgeführt...
Ich hab hier im Archiv was dazu gefunden, aber da lief es darauf hinaus, dass der Browser schuld sei....
Ich habe das mit dem IE 6.0 und Netscape 7.01 ausprobiert, beides mal der gleiche Fehler...
Gibt es mittlerweile neue Erkenntnisse in dem Bereich? Weis da jemand was ??
PS. ich möchte im Enteffekt eine Html-Seite Laden lassen und nach einer festgelegten Zeit wieder eine andere...
Kennt jemand vielleicht eine andere Lösung für das Problem (PHP-basiert) ?
Gruss und Danke Adrian
echo "Jetzt passiert 3 Sekunden gar nichts.<br>\n";
flush();
sleep(3);
echo "<br>\n";
echo "Die 3 Sekunden sind vorbei und erst jetzt<br>";echo "wird dieser Text ausgegeben.\n";
JEdoch wird das gesammte Script erst nach 3 Sekunden ausgeführt...
Ich hab hier im Archiv was dazu gefunden, aber da lief es darauf hinaus, dass der Browser schuld sei....
Es kann der Browser sein, es kann aber auch genauso gut der Server selbst sein. Das erfährst Du am ehesten, indem Du per telnet die Verbindung zum Server selbst aufbaust (Bedienung findest Du sicher auch im Archiv, Stichworte "telnet", "HTTP" und vielleicht "GET").
Beim Browser ist das Problem in der Regel, daß er weitere Daten benötigt, um die Position und Größe der Elemente berechnen zu können; bestes Beispiel: Tabellen.
Beim Server kann es vielfälltige Ursachen geben, Änderungen sind da mit Rücksicht auf die Gesamtleistung des Servers wenig ratsam.
Ich habe das mit dem IE 6.0 und Netscape 7.01 ausprobiert, beides mal der gleiche Fehler...
HTTP wurde zum schnellen Datenübertragen erfunden, nicht für diese Art von "interaktiven Anwendungen". Fehler würde ich das insofern nicht nennen, eher Verhalten.
PS. ich möchte im Enteffekt eine Html-Seite Laden lassen und nach einer festgelegten Zeit wieder eine andere...
Kennt jemand vielleicht eine andere Lösung für das Problem (PHP-basiert) ?
Wozu unbedingt PHP-basiert? HTML bietet ein <meta>-Tag, das exakt diesen Zweck erfüllen kann: http://selfhtml.teamone.de/html/kopfdaten/meta.htm#weiterleitung.
Gruß,
soenk.e
Hallo Adrian,
das "Phänomen", welches Du skizzierst stellt keinen Fehler dar. Ein PHP-Skript wird i.d.R. komplett abgearbeitet und Ausgaben (z.B. mit echo oder print) werden in den Ausgabe-Puffer geschrieben. Dieser wird erst am Ende des Skriptlaufs an den Browser gesendet. Evtl. kann man dieses Verhalten mit den Ausgabepufferfunktionen von PHP beeinflussen (sh. "Funktionen zur Ausgabesteuerung" im PHP-Manual).
Es sollte also der erste Teil sofort und der Zweite nach 3 sekunden ausgegeben werden!
JEdoch wird das gesammte Script erst nach 3 Sekunden ausgeführt...
Soweit ich weis, lässt sich sowas mit dem "Server Push"-Verfahren realisieren. Damit kenne ich mich aber nicht so doll aus. Nur ein Link: http://wp.netscape.com/assist/net_sites/pushpull.html.
PS. ich möchte im Enteffekt eine Html-Seite Laden lassen und nach einer festgelegten Zeit wieder eine andere...
Ich weis nicht genau, aber ich würde mal das versuchen (muss VOR jeglichen Ausgaben im PHP-Skript stehen):
<?php header('Refresh: 3; URL=foo.html'); ?>
viele Grüße
Achim Schrepfer
Ich weis nicht genau, aber ich würde mal das versuchen (muss VOR jeglichen Ausgaben im PHP-Skript stehen):
<?php header('Refresh: 3; URL=foo.html'); ?>
"Refresh" gibt es im HTTP-Protokoll nicht, zumindest nicht in der Version 1.1 (siehe http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14, Abschnitt "Header Field Definitions").
Gruß,
soenk.e
Hi soenke,
"Refresh" gibt es im HTTP-Protokoll nicht, zumindest nicht in der Version 1.1 (siehe http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14, Abschnitt "Header Field Definitions").
tja, das dachte ich mir schon fast. War mal einen Versuch wert wegen "<meta http-equiv..." ;-)
viele Grüße
Achim Schrepfer
Moin!
"Refresh" gibt es im HTTP-Protokoll nicht, zumindest nicht in der Version 1.1 (siehe http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14, Abschnitt "Header Field Definitions").
tja, das dachte ich mir schon fast. War mal einen Versuch wert wegen "<meta http-equiv..." ;-)
Tja, das führt in der Tat in die Irre. Mich auch. Aber ich hab' mal ein wenig recherchiert, und dabei erscheint es mir so, dass Netscape diesen Refresh-Header eigenständig zum Standard hinzuaddiert hat, er aber niemals offiziell wurde.
Nicht alle Browser unterstützen angeblich die Meta-Variante. Noch weniger Browser unterstützen dann wohl die Variante als echter HTTP-Header. Es ist in der Tat sehr nervig, wenn sich ohne eigenes Zutun plötzlich die Seite auswechselt.
Andererseits: Es gibt auch mit Javascript Mittel und Wege, das zu tun. Und gute Browser wie Opera erlauben es, jeglichen automatischen Redirect (und wohl dann auch Refreshes) abzuschalten (damit surft es sich dann zwar sehr nervig, weil man ungefähr doppelt soviel klicken muß, aber man sieht, dass man ständig umgeleitet wird).
Warum Refresh nicht in den HTTP-Standard aufgenommen wurde, wird deshalb wohl ewig ein Rätsel bleiben. Aber dass das Meta-Tag als behelfsweiser Ersatz für einen echten Redirect von Browsern interpretiert wird, erscheint logisch - Netscape machts vor, alle anderen müssen es nachmachen. Und dass manche Browser offenbar soweit gehen, ihre Implementierung von http-equiv-Metas so zu stricken, dass diese Tags zuerst echt dem HTTP-Header zugeschlagen werden, und dann folglich auch eine HTTP-Header-Implementation für Refresh existieren muß, erscheint dann folgerichtig.
- Sven Rautenberg