2009-08-10 2 views
6

Ich habe festgestellt, dass einige meiner ajaxlastigen Sites (die ich besuche, nicht die, die ich gebaut habe) bestimmte Auto-Refresh-Funktionen haben. Wenn ich beispielsweise in Google Mail eine neue Nachricht erhalte, sehe ich die neue Nachricht ohne Neuladen der Seite. Dasselbe gilt für den auf Facebook basierenden IM-Client. Soweit ich das beurteilen kann, gibt es keine Java-Applets, die die Server-Browser-Bindung behandeln, also muss ich annehmen, dass es von AJAX und vielleicht einem Element, das mir nicht bekannt ist, gemacht wird. Also durch meine beste Vermutung, ist es in einer von zwei Arten erfolgen:Reverse AJAX? Können Datenänderungen zum Skript "PUSHED" sein?

  1. Die Javascript tut ein stetiges „ping“ zu einem serverseitigen Skript für alle Updates überprüft, die verfügbar sein könnte (was, warum einige erklären würde, von diesen Seiten bringen andere schwere Seiten zum Crawlen). oder

  2. Das Javascript sitzt untätig und ein serverseitiges Skript "pusht" tatsächlich alle Aktualisierungen an den Browser. Aber ich bin mir nicht sicher, ob das möglich ist. Ich könnte mir vorstellen, dass es eine Art von AJAX-Funktion gibt, die immer noch pingt, aber alle fragt einfach "irgendwelche Updates?" und das Server-Skript hat einen einfachen booleschen Wert, der sagt "nein" oder "Ich bin froh, dass du gefragt hast". Wenn dies jedoch der Fall ist, müssten alle Datenänderungen das Skript direkt aufrufen, so dass es die Datenänderungen bereithält und die Änderung an dieser booleschen Funktion vornimmt.

So ist das möglich/durchführbar/wie es funktioniert? Ich stelle mir etwas wie:

Jemand sendet eine E-Mail/IM/DB-Update auf den Server, der Server ruft das Skript mit der URL des Skripts plus einige relevante GET-Variable, das Skript notiert die Änderung und aktualisiert die Variable "Updates verfügbar" , der AJAX erhält die Antwort, dass es tatsächlich Updates gibt, der AJAX führt seine normalen "update page" -Funktionen aus, die die normalen Update-Skripte ausführen und sie an den Browser ausgeben.

Ich frage, weil es wirklich ineffizient scheint, dass die js nur eine ständige Kontrolle zu tun, die a) den Server arbeiten alle 1,5 Sekunden zu tun erfordert, und b) mein Browser arbeiten alle 1,5 Sekunden zu tun einfach so, dass an meinem Ende Ich kann sagen "Oh Junge, ich habe eine IM! Genau wie ein echter IM-Client!"

Antwort

6

über Comet

+0

Wow, ich habe sogar die gleichen Schlagworte verwendet. das ist fast peinlich.Aber meine erste Suche, wie man das in PHP macht, erwähnt Endlos-Loop-Skripte. Muss irgendwo auf der Linie eine Endlosschleife stattfinden, damit diese Art von Dingen funktioniert? Warum kann die tatsächlich geänderte Datenquelle (IMAP-Server, DB, TXT-Datei, was auch immer) nicht das Skript dazu veranlassen, aufzuwachen und mit den Dingen umzugehen? – Anthony

0

Lesen Ich habe auf einem kleinen .NET Web tatsächlich worden App arbeiten, beschrieb die Ajax mit langen Abfragetechnik verwendet.

Je nachdem, welche Technologie Sie verwenden, können Sie Thread-Signalisierungsmechanismen verwenden, um Ihre Anforderung zu speichern, bis ein Update abgerufen wird. Mit ASP.NET Ich führe meinen Server auf einem einzelnen Computer, so dass ich einen Verweis auf mein Producer-Objekt speichern (das einen Thread enthält, der die Daten verarbeitet). Um den Daten-Pull zu initiieren, wird die Subscribe-Methode meines Dienstes aufgerufen, die ein Consumer-Objekt erstellt, das beim Producer registriert ist. Wenn der Consumer-Polling-Modus lang ist, verfügt er über ein AutoResetEvent, das immer dann signalisiert wird, wenn neue Daten empfangen werden. Wann immer der Webclient Daten anfordert, wartet der Consumer zuerst auf das Reset-Ereignis und gibt es dann zurück.

Aber Sie erwähnen etwas über PHP - soweit ich weiß, wird die Persistenz durch Serialisierung beibehalten, das Objekt wird nicht im Speicher gehalten, also weiß ich nicht, wie Sie ein Producer-Objekt mit $ _CACHE [] referenzieren könnten oder $ _SESSION []. Als ich in PHP entwickelte, wusste ich nie wirklich etwas über Multithreading, also habe ich nicht damit herumgespielt, aber ich denke, dass Sie sich das genauer ansehen können.

Die Verwendung von Endlosschleifen wird viel Rechenleistung verbrauchen - ich würde alle anderen Optionen zuerst ausschöpfen.