Parallel Request mit AJAX und PHP
Das Ausführen von zwei parallelen Requests mit AJAX ist nicht ganz einfach, aber machmal Notwendig. Zu beachten ist das jeder Browser nur eine gewisse Anzahl gleichzeitiger Requests an den gleichen Server ausführen kann.
Ich ging also mutig ans Werk und habe das mal ausgetestet in dem ich einen kleinen Chat implementierte (dazu später mehr). Dazu habe ich das Prototype-Framework verwendet, dessen inoffizielle Dokumentation findet man hier. Eine Request pollt für neue Nachrichten, während ein anderer auf Befehl des Benutzers nachrichten sendet. Irgendwie gingen die Nachrichten nacheinander über den Äther. Ein Schuldiger musste her! Der Schuldige ist bei mir immer im Javascript-Teil zu suchen. Vermutlich setzte das bösse Prototyp-Framework die Request in Serie. Mit dieser Vermutung machte ich auf die Suche in der Doku, im Code (zum Glück nicht so viel Code) und mit FireBug zur Laufzeit.
Und schlussendlich war dann doch nicht der Client schuld. Der "Fehler" steckte im Serverteil und wenn ich mich in PHP nicht so sicher fühlen würde hätte ich vermutlich auch früher die Kommentare in der PHP-Dokumentation gelesen. Da hatte einer zur pre-AJAX Zeit mit Frames ein ziemlich ähnliches Problem. Ich habe beim benchmarken gemerkt das session_start() ewig hängen bleibt.
Der Grund dafür ist einfach und irgendwie logisch, wird eine Session in PHP geöffnet wird sie standardmässig bis zum Abschluss des Seitenaufbaus offen gelassen. Während dieser Zeit ist es nicht möglich die Session erneut zu öffnen, der Aufruf von session_start() blockiert bis die Session vom anderen Request geschlossen wird. Das war auch der Grund warum das Seiten nacheinander abgearbeitet werden.
Die Lösung ist in meinem Fall relativ einfach. In dem lange dauernden Request greife ich nur auf eine einzige Variable lesend zu. Ich lese deshalb nach dem Öffnen der Session die Session-Variable in ein lokale Variable ein und schliesse danach die Session mit session_write_close() gleich wieder. Danach gehts auch mit zwei parallelen Request ohne Probleme und der JavaScript-Teil ist für einmal entlastet!
Ich ging also mutig ans Werk und habe das mal ausgetestet in dem ich einen kleinen Chat implementierte (dazu später mehr). Dazu habe ich das Prototype-Framework verwendet, dessen inoffizielle Dokumentation findet man hier. Eine Request pollt für neue Nachrichten, während ein anderer auf Befehl des Benutzers nachrichten sendet. Irgendwie gingen die Nachrichten nacheinander über den Äther. Ein Schuldiger musste her! Der Schuldige ist bei mir immer im Javascript-Teil zu suchen. Vermutlich setzte das bösse Prototyp-Framework die Request in Serie. Mit dieser Vermutung machte ich auf die Suche in der Doku, im Code (zum Glück nicht so viel Code) und mit FireBug zur Laufzeit.
Und schlussendlich war dann doch nicht der Client schuld. Der "Fehler" steckte im Serverteil und wenn ich mich in PHP nicht so sicher fühlen würde hätte ich vermutlich auch früher die Kommentare in der PHP-Dokumentation gelesen. Da hatte einer zur pre-AJAX Zeit mit Frames ein ziemlich ähnliches Problem. Ich habe beim benchmarken gemerkt das session_start() ewig hängen bleibt.
Der Grund dafür ist einfach und irgendwie logisch, wird eine Session in PHP geöffnet wird sie standardmässig bis zum Abschluss des Seitenaufbaus offen gelassen. Während dieser Zeit ist es nicht möglich die Session erneut zu öffnen, der Aufruf von session_start() blockiert bis die Session vom anderen Request geschlossen wird. Das war auch der Grund warum das Seiten nacheinander abgearbeitet werden.
Die Lösung ist in meinem Fall relativ einfach. In dem lange dauernden Request greife ich nur auf eine einzige Variable lesend zu. Ich lese deshalb nach dem Öffnen der Session die Session-Variable in ein lokale Variable ein und schliesse danach die Session mit session_write_close() gleich wieder. Danach gehts auch mit zwei parallelen Request ohne Probleme und der JavaScript-Teil ist für einmal entlastet!





