Comet Streaming
Eine der häufigsten Fragen im Xajax Community Forum ist die Frage nach Comet-Streaming in Xajax 0.5. Als "Comet Streaming" bezeichnet man das ServerPush-Verfahren, bei dem über eine persistente Verbindung zwischen Server und Client ständig Befehle gesendet werden.
Die Technik an sich ist keineswegs neu, im Zuge des Web2.0 Hypes wurde sie "Comet" getauft und erfreut sich bei Entwicklern wachsender Beliebtheit. Der Haken daran ist nur, dass die Möglichkeiten der Implementierung in den Browsern sehr unterschiedlich ausfallen. An dieser Stelle setzt das neue Plugin an.
Mit Hilfe des Comet-Streaming Plugins für Xajax 0.5, können nun sämtliche von Xajax bereitgestellten Funktionen für Response-Commands fast live zum Client übertragen und dort ausgeführt werden. Derzeit untersützt das Plugin FireFox 2, Opera 9, Safari 3 und den Internet Explorer in den Versionen 6 und 7. Die Unterstützung weiterer Browser und Versionen wird nach und nach geschehen.
Das Setup sieht erst einmal genau so aus, wie bei jeder anderen Xajax Anwendung. Nach dem Einbinden der Xajax-Klasse in PHP, wird das Plugin geladen.
$core = './xajax/xajax_core'; require_once $core . '/xajax.inc.php'; $xajax = new xajax(); require_once $core . '/xajaxPlugin.inc.php'; require_once $core . '/xajaxPluginManager.inc.php'; require_once './xajax/xajax_plugins/response/comet/comet.inc.php';
Anschließend können alle nötigen Konfigurationen vorgenommen werden, sei es die JavaScript URI oder der Zeichensatz. Wichtig ist, dass die Konfiguration erst nach dem Einbinden des Plugins erfolgt, da die Konfiguration sonst nicht von Xajax an das Plugin durchgereicht werden kann.
$xajax->configure('javascript URI', '/library/xajax/');
Als Ziel wird stets der Webpfad angeben, in dem Xajax samt seiner Unterverzeichnisse liegt. Bei einem falschen Pfad oder anderer Reihenfolge kann das Plugin schnell den Browser in die Knie zwingen, da die persistente Verbindung vom Server nicht verarbeitet wird.
Beim Registrieren der Funktionen gibt es eine kleine Änderung zu beachten. Anstatt wie gewöhnlich eine Mehode mit XAJAX_FUNCTION zu registrieren, lautet die Konstante XAJAX_COMET.
$xajax->register(XAJAX_COMET,"testComet");
Das Registrieren von Objekten oder Objekt-Methoden unterstützt das Plugin noch nicht.
Die Response-Commands sind immernoch die selben, allerdings instanziieren wir statt XajaxResponse() nun die Klasse xajaxCometResponse();
[code]function testComet () { $objResponse = new xajaxCometResponse(); for ($i=0;$i<=50;++$i) { $objResponse->assign("progress","style.width",($i*3)."px"); $objResponse->assign("progress","innerHTML",($i*2).'%'); $objResponse->flush(); } return $objResponse; }
Die Funktion zeigt, wie in einer For-Schleife verschiedene Kommandos in die ResponseQueue eingefügt werden. Neu ist die Funktion ->flush(). Diese Funktion sendet die Kommandos direkt an den Browser, leert die Queue und lässt das PHP-Script eine gewisse Zeit (rund 1sec) schlafen um dem Server etwas Luft zu verschaffen. Das Beispiel simuliert eineb Fortschrittsbalken der zB bei langen Datenbank Im- / Exporten oder Dateiuploads verwendet werden kann.
Das ist auch schon alles was man für das Comet-Streaming benötigt.
Zu finden ist das Plugin auf der Xajax Website. Eine Demo gibt es hier.
EnemyArea sagt
am 22. März 2008 @ 13:10
Huhu,
hört sich ja mal ganz nett an. das Problem ist, das es im FF nicht geht, also die Demo mein ich… ist echt schade. Fragwürdig ist es nur, wie viele von diesen Requests offen sein können, ohne das der Server down geht. Das 1 Sec delay ist auch nicht grade super… das sleep verschafft dem server nämlich keinerlei pause sondern stoppt den nur. was ich mich nur frage, kann man damit nur empfangen oder auch senden?