Ich hätt da gern mal ein Problem. Ich bin gerade am Testen der Möglichkeit von Push-Dokumenten über den Content-type multipart/mixed (x-mixed-replace), aber irgendwie funktioniert es in keinem Browser wie es soll.
Internet Explorer interpretiert mixed und x-mixed-replace gleich als mixed, hängt also die nachgeladenen Inhalte an das Ende der Datei, dafür ignoriert er boundary (er zeigt es auf der Seite an) und die weiteren Content-types.
Firefox interpretiert mixed und x-mixed-replace identisch als x-mixed-replace und ersetzt bei beiden die Inhalte, ebenso macht es Opera.
Nach RFC wäre aber bei allen Browsern ein anderes Verhalten zu erwarten (okay, nicht bei IE, da weiß man, daß er es nicht standardkonform löst).
Content-type: mutipart/mixed sollte die neuen Inhalte an das Ende hängen, Content-type: multipart/x-mixed-replace sollte den aktuellen Inhalt durch den neuen ersetzen.
Hier der Testcode (nicht schön, aber selten) ;o)... Ist da eventuell ein Fehler drinnen, der dies verursacht, denn eigentlich sollte laut Recherche Firefox beide Angaben richtig interpretieren?
<?php
class Multipart {
/*
Klasse um Inhalte zum Client zu "pushen".
$delimiter hat zwei Funktionen. Erstens definiert er einen
Zufalls-String als Boundary zudem zeigt er an, ob es sich um
den Internet Explorer handelt. In letzterem Fall werden
Content-type und boundary nicht ausgegeben (IE-Bug).
*/
var $delimiter;
function Multipart($mode = false) {
// Konstruktor. Der Parameter $mode entscheidet, ob mixed, oder x-mixed-replace genutzt werden soll.
// max_execution_time auf 6 Stunden (fuer Produktivcode zu lang!)
set_time_limit(21600);
// Destruktor registrieren um abschliessendes boundary zu uebertragen
register_shutdown_function(array (& $this, \'MultipartEnd\'));
// Delimiter als Zufallsstring erzeugen fuer Header
$this->delimiter = md5( uniqid ( rand() ) );
// Weiche fuer die verschiedenen Modi
if ($mode === false) {
// Inhalte werden durch neue ersetzt
header(\'Content-type: multipart/x-mixed-replace; boundary="\'.$this->delimiter.\'"\');
print "x-mixed-replace\\n";
} else {
// Inhalte werden durch neue ergaenzt
header(\'Content-type: multipart/mixed; boundary="\'.$this->delimiter.\'"\');
print "mixed\\n";
}
// Delimiter um -- ergaenzen, bzw fuer IE eliminieren
$this->delimiter = ( strstr(getenv(\'HTTP_USER_AGENT\'), \'MSIE\') ? false : \'--\'.$this->delimiter );
}
function MultipartSend($content, $type=\'text/plain\') {
// Inahlte pushen (TODO: encoding)
if($this->delimiter) {
// Hier fuer Browser != IE (boundary und Content-type ausgeben)
print $this->delimiter."\\n";
print \'Content-type: \'.$type."\\n\\n";
}
print $content;
// Impliziertes Leeren des Ausgabepuffers
flush();
}
function MultipartEnd() {
// Destruktor
if($this->delimiter)
print $this->delimiter."--\\n"; // Abschliessendes boundary
flush();
}
}
$mp = new Multipart(1);
for($i=1;$i<11;$i++) {
$mp->MultipartSend("$i von 10\\n");
sleep(1);
}
?>