2012-03-25 9 views
3

Jetzt, da alle Browser, die ich mag, fast volle Unterstützung für Server gesendet Ereignisse haben, wollte ich versuchen, es auf einer Website zu implementieren, die ich verschoben habe, weil ich Abstimmung hasse. Aber ich habe anfangs gezögert, dass ich hoffte, dass ich etwas Hilfe bekommen könnte.So lösen Sie ein Server-gesendetes Ereignis in HTML5 aus ... ODER: Kann PHP-Skript erkennen, ob ein anderes Skript aufgerufen wurde?

Hier ist meine Anwendungsfall:

Benutzer in eine Form geht, etwas zeitbasierte und wettbewerbsfähig ist, in diesem Fall Klasse Registrierung. Wenn alle Dinge gleich sind, haben sie eine Liste von ungefähr 30 - 40 Klassen, für die sie berechtigt sind, und um Instanzen zu minimieren, "sie hat sich zuerst eingeloggt, aber er hat zuerst gehackt, aber sie wollte nicht sparen, aber sie hat bereits gewählt eine andere Klasse "etc, möchte ich das Formular in Echtzeit machen, so dass, wenn jemand eine Option auswählt, es direkt in die db geht und jeder andere, der das Formular sieht, sieht, dass es voll ist. (Ich werde mich mit dem Stress der Menschen beschäftigen, die später ihre Meinung ändern).

Also musste ich mich in einem Polling-Szenario mit den AJAX-Anrufen befassen, die den Status von 40 Punkten überprüfen und sie aktualisieren mussten und ein Intervall setzen, das möglicherweise noch Kollisionen verursachen könnte.

Aber mit Server Sent Events, kann ich den Hörer nur die Flecken bekommen haben, die aktualisiert werden müssen, die besser scheint, aber hier ist, wo ich stecken:

  1. Gibt es ein Risiko des Hörers überlastet zu werden ? Nehmen wir an, das Skript sendet 15 Nachrichten nacheinander über eine Statusänderung. Ich sehe vage Erwähnungen darüber, wie Benutzeragenten in der Warteschlange befindliche Aufgaben behandeln sollten, aber es ist nicht klar, ob das für den Aufbau einer Verbindung oder die Verarbeitung serverseitig gesendeter Nachrichten ist

    Ist dies im Grunde nur die Last der Abfrage vom Browser an den Server übergeben? Muss das Skript die Datenbank jede Sekunde auf Änderungen überprüfen? Gibt es eine Möglichkeit, dass das Skript benachrichtigt wird oder benachrichtigt wird, wenn eine Änderung aufgetreten ist? Nehmen wir an, dass Sitzanfragen über Ajax an requests.php gesendet werden und dass updates.php Ereignisse zurück an den Browser schiebt. Gibt es einen standardmäßigen und/oder cleveren Weg, updates in den Leerlauf zu versetzen, bis requests einen Commit gemacht hat?

Die einzige Lösung, die ich denken kann, ist für requests.php welche die Änderungen eine flache Datei (commits.xml vielleicht) und updates.php nur fragt die Dateigröße jede halbe Sekunde zu schreiben, wodurch die Arbeitsbelastung auf ein Minimum zu halten.

Gibt es bessere/smartere/offenere Lösungen da draußen?

+0

"Jetzt, da alle Browser, die ich mag fast die volle Unterstützung für Server gesendete Ereignisse" unlogisch haben, enden serverseitige Ereignisse vor jeder Ausgabe, die einen Browser enthalten kann oder nicht –

+0

@Dagon [Server Gesendete Ereignisse] (http://dev.w3.org/html5/eventsource/) und serverseitige Ereignisse sind nicht identisch. Um genauer zu sein, ein [Server gesendet Ereignis] (http://en.wikipedia.org/wiki/Server-sent_events) ist eine Art von Server-Side-Event, die auf eine persistente Verbindung im Browser geschoben wird, wodurch die Notwendigkeit für Ajax-Umfrage. Es ist neu in HTML5 und immer noch ein funktionierender Entwurf, wurde aber von allen außer IE schnell übernommen. – Anthony

Antwort

0

Polling Ihre Datenbank für Änderungen ist keine gute Idee. Stattdessen sollten Sie PUB/SUB auf dem Server verarbeiten. Dazu können Sie eine Nachrichtenwarteschlange wie RabbitMQ, ZeroMQ oder Redis PUB/SUB verwenden.