2010-09-15 8 views
6

Ich weiß, dass es Comet-Server-Technologien, die dies tun, aber ich möchte etwas Einfaches und Eigengewachsen schreiben.MySQL trigger + notify eine lang-polling Apache/PHP-Verbindung

Wenn ein Datensatz in eine MySQL-Tabelle eingefügt wird, möchte ich, dass er diese Daten irgendwie mit einer Reihe von lang abgefragten Apache-Verbindungen unter Verwendung von PHP (oder was auch immer) kommuniziert. So "hören" mehrere Personen durch ihren Browser und die zweite MySQL INSERT passiert, wird an ihren Browser gesendet und ausgeführt.

Der einfache Weg ist, das PHP-Skript die MySQL-Datenbank abfragen zu lassen, aber das führt nicht wirklich vom Server aus und führt zu einer inakzeptablen Reihenfolge unnötiger Datenbankabfragen. Ich möchte diese Daten von MySQL zu der Long-Polling-Verbindung im Wesentlichen ohne die Listener überhaupt abfragen.

Irgendwelche Ideen zur Umsetzung?

Antwort

0

Das ist etwas, nach dem ich seit vielen Jahren auch gesucht habe. Ich habe keine Funktionalität gefunden, wo der SQL-Server eine Nachricht auf INSERTS, DELETE und UPDATES ausgibt.

TRIGGERS kann SQL für diese Ereignisse ausführen, aber das ist hier nicht sinnvoll.

Ich denke, Sie müssen Ihr eigenes System aufbauen. Sie können einfach einen UDP von PHP (Example in first comment) übertragen, das Problem ist, dass PHP auf der Serverseite läuft und die Clients statisch sind.

Meine Vermutung wäre, dass Sie ein Java-Applet auf dem Client ausführen könnten, auf die UDP-Nachricht warten und dann eine Aktualisierung der Seite auslösen könnten.

Dies war nur ein paar Gedanken im Moment des Schreibens ...

+0

Vielleicht ist der Auslöser könnte so etwas wie Memcached schreiben und die PHP, dass abfragen könnte? – phazei

+0

PHP ist statisch und läuft nicht im Hintergrund. Es gibt einige Tricks aus dem Buch, wie man es als "Thread" erscheinen lässt, aber dann kommt das nächste Problem, aktualisieren Sie die Client-Seite. Ich würde sagen, dass die Abstimmung von AJAX durchgeführt werden muss. Es könnte genug sein, um nach dem letzten Änderungsdatum zu suchen (geschrieben von Triggern). Wenn es neuer ist, laden Sie die Seite neu. –

2

Ich habe nach einer Lösung für das so gut und den einzigen Weg, um alle Arten von Ideen versuchen, die Abfrage von SQL-Abfragen zu nehmen ist, poll stattdessen eine Datei. Wenn die Füllung gleich 0 ist, fahre mit dem Schleifen fort. Wenn die Datei gleich 1 ist, müssen Sie SQL-Abfragen ausführen und an Benutzer senden. Es fügt eine weitere Ebene der Komplexität hinzu, aber ich denke, es bedeutet weniger Arbeit von MySQL, aber dasselbe für Apache oder was auch immer Looping-Daemon. Sie könnten den Befehl auch an einen Dämon "Kometen" senden, aber er wird bei jeder Anfrage auch eine Gabelung und eine Schleife bilden, von dem, was ich gesehen habe, wie Steckdosen funktionieren, hoffentlich findet jemand eine Lösung dafür.

0

MySQL ist wahrscheinlich nicht das richtige Werkzeug für dieses Problem. Regilero schlug vor, die DB zu wechseln, aber eine einfachere Lösung könnte sein, etwas wie redis zu verwenden, das eine Pub/Sub-Funktion hat.

http://redis.io/topics/pubsub