2010-12-22 7 views
1

Benötigen alle Comet-Style-Anwendungen eine Schleife irgendwo in der Anwendung auf der Serverseite, um Updates/Änderungen zu erkennen? Wenn nein, könnten Sie mir bitte erklären, wie die Logik hinter einer Anwendung von "loopless Kometen" funktioniert?Komet-Style-Anwendung mit Loops

Antwort

1

Diese Art von Anwendung wird immer eine Schleife benötigen, müssen Sie regelmäßig nach neuen Daten usw. überprüfen. Natürlich können Sie die "Schleife" nicht blockieren, indem Sie eine even-loop-basierte Ansatz verwenden, aber am Ende gibt es immer noch eine Schleife irgendwo.

Denken Sie einen Moment darüber nach, wie würden Sie es ohne Schleife machen? Ich kann mir sicher keinen Weg vorstellen, der keine Schleife irgendwo verwendet.

+0

Also im Grunde Google Wave, mit dort Schlüsselwortebene Zusammenarbeit System, in dem Looping in ihrer Datenbank für jeden Taste drücken Unterschied Überprüfung ??? – oshirowanen

+0

Ich verstehe nicht, was Sie meinen, indem Sie "ihre Datenbank einlaufen lassen". Natürlich, wenn Sie Echtzeit-Collaboration haben möchten, müssen Sie für jeden Tastendruck, den ein Benutzer sendet und dann an die anderen Benutzer senden, ihre Zwischenspeicherung im Spiel, um die Anzahl der Datenbank-Schreibvorgänge zwar zu reduzieren, aber Sie müssen immer noch die Kometenverbindungen auf neu eingehende Daten prüfen, was eine Schleife erfordert (ob blockierend oder nicht). –

+0

Ist es nicht möglich, den Server auf einen Tastendruck warten zu lassen, und sobald er einen Tastendruck von Benutzer1 empfängt, sendet er diesen Tastendruck an Benutzer2,2,3,4, n und speichert diesen Tastendruck in der Datenbank? – oshirowanen

1

Kurze Antwort ist, nein, nicht alle erfordern eine Schleife auf der Serverseite.

Stattdessen können Sie lange Polling AJAX-Aufrufe aus der Browser-Daten verwenden, verlangen

bei dem der Server einfach mit den Daten und der Browser reagiert wartet, bis die Antwort vor dem Senden eine neue Anfrage bekommen wird.

+0

aber wie wartet der Server? über Schleifen? – oshirowanen

+0

Es wartet nicht. Es reagiert nur kontinuierlich. – Mantar

+0

Aber was ist, wenn es 10 Minuten lang keine Veränderung gibt, woher weiß es, wenn eine Veränderung eintritt? – oshirowanen

1

Die Lösung könnte Stream_set_blocking sein. Verwenden Sie eine beliebige blockierende Ressource, die vom Betriebssystem angehalten wird, und warten Sie auf die entsprechende Unterbrechung.

Client-Seite:

  1. Aufruf Ajax-Skript zum Endpunkt (Timeout für Ajax zB 30 Sekunden - nach 30 Sekunden eines anderen initiieren ein - Skript Ausführungszeit erreicht - nach 30 Sekunden werden Sie Antwort vom Server erhalten)
  2. Wenn Sie Reaktion während 30 Sekunden behandeln Antwort (async) und eröffnen neue Verbindung erhalten (wie in Kometen getan - ich sah es in cometD Client)

Server-Setup:

  1. Setup-Apache-Timeouts (zwischen Anforderungs- und Daten zu 30-31 Sekunden gesendet werden), ist dies so wird Apache ermöglicht es Ihnen, so viel
  2. Satz Apache warten viele Kind-Instanzen (gleichzeitige Benutzer * 1.5) zu ermöglichen, aber Sie müssen sicher sein, dass Sie genügend Speicher für diese Menge an apache-Instanzen (+ Speicher verwendet von pHP Kinder)

Script eine haben:

  1. execution_time = 28
  2. Satz shutdown_function in o rder senden Antwort (Timeout, aber formatiert und verständlich für Ajax, wenn Sie es brauchen)
  3. Sie müssen Datei öffnen, leere
  4. Modus Blockierung ermöglichen
  5. mit stream_set_blocking für Datei-Stream
  6. versuchen aus einer Datei lesen und Sie werden suspendiert werden, bis ein anderer Prozess in die Datei schreibt oder Timeout erreicht wird.
  7. Sobald das Skript Inhalt in einer Datei erhält, die von einem anderen Prozess geschrieben wurde, wird es zurückkommen und eine Antwort senden.(Dies wird eine andere Ajax-Aufruf auslösen und andere schlief Prozess)

Schlimmste ist, dass Sie denken müssen, wie mehrere Leser-Skripte erhalten aus demselben Bus zu lesen (Datei) ohne einander zu stören. Es könnte auch sein, dass die Zeitüberschreitung genau dann ist, wenn die Nachricht in den Bus geschrieben wird.

(hoffen, dass diese Lösung nicht so schlimm wie mein Englisch ist)