Frage

Wie kann ich einen Echtzeit -Chat mit Xajax und PHP schreiben?

Mit anderen Worten, gibt es eine Möglichkeit, Xajax -Antworten vom Server an mehrere Clients zu senden? Oder ist die einzige Möglichkeit, alle paar Sekunden auf der Client -Seite nach neuen Nachrichten zu überprüfen?

War es hilfreich?

Lösung

Nein. Clients müssen den Server wiederholen.

Ich denke, der Schlüssel hier ist, Interaktionsdesign zu denken. Der Trick besteht darin, den Benutzer zu täuschen, zu denken, dass der Chat sofort ist, aber in Wirklichkeit aktualisiert er alle 1 oder 2 oder 3 oder 10 Sekunden.

Ideen:

1) Wenn der Benutzer eine Nachricht sendet, zeigen Sie sie direkt im Chat an und lösen Sie eine Umfrage aus.

2) Wenn eine Umfrage mit mehreren Nachrichten von anderen Benutzern zurückkommt, fügen Sie sie nicht alle auf einmal hinzu, fügen Sie sie tatsächlich über einen Zeitraum von 1 bis 2 Sek. Fügen "sofort" und unabhängig. (Wenn eine Reihe von Nachrichten sofort eingehen, ist der Benutzer sehr schnell erkennt, dass der Chat dort und dann und nicht kontinuierlich aktualisiert wurde.)

3) Wenn der Benutzer für x Zeit in Leerlauf ist. Lassen Sie die Wahlrate auf einmal alle 10 Sekunden oder so fallen.

4) Wenn der Benutzer aktiv ist, dh eine Menge Nachrichten sendet, befragen Sie öfter.

5) Haben Sie eine statische Datei für jeden Kanal, auf den Sie die Zeit schreiben, auf die der Chat zuletzt aktualisiert wurde. Zum Beispiel Datei chat-teenfun-lastupdate.txt hat den Inhalt 1224934239 Oder welches Zeitformat Sie bevorzugen. Servieren Sie diese Datei statisch und lassen Sie die Clients diese Datei befragen, um zu überprüfen, ob der Kanal aktualisiert wurde, sondern das Anruf chat-poll.php?ch=teenfun Das macht eine dynamische Überprüfung. Statische Dateien werden je nach Arbeit, die für das dynamische Skript beteiligt sind, etwa 10-100 Mal schneller serviert.

Viel Glück und hab Spaß!

/0

Ps. Alternativ können Sie Clients tatsächlich einen Ajax -Anruf auf den Server durchführen und sie "hängen" halten. Das heißt, Sie akzeptieren ihre Anfrage und geben vor, Daten zurück zu senden, aber dann pausieren Sie einfach. Wenn etwas passiert, beenden Sie die Reaktion mit den Auflistungsdaten. Damit dies funktioniert, müssten Sie jedoch Ihren eigenen HTTP-Server schreiben, was dies ausdrücklich tut, da Sie nicht 250 PHP-Prozesse im Gedächtnis abhängen können. Vielleicht könnte LightTPD auf diese Weise mit diesem Lua -Cache -Mod verwendet werden. Ich weiß nicht. Wäre allerdings interessant. Zur Hölle, ich muss es irgendwann versuchen :)

Andere Tipps

Sicher gibt es, aber ich denke nicht, dass es für viele Benutzer sehr effizient sein wird. Sie können entweder umfragen, wo jeder Client den Server befragt, um festzustellen, ob neue Nachrichten vorliegen, oder Sie können die verwenden Kometentechnik in dem der Server neue Nachrichten an die Clients weitergeben kann - überprüfen Sie die Komet -Plugin für Xajax. Wie dies mit Xajax und PHP implementiert wird, ist mir ein Rätsel, aber hier ist, wie ich versuchen würde, es zu implementieren.

Lassen Sie jeden Client dann eine Verbindung zum Server (Anmeldung usw.) herstellen und dann:

  1. Für jede von einem Client (Absender) gesendete Nachricht aktualisieren Sie die Meldungswarteschlange für Client (Empfänger)
  2. Lassen Sie den Client -Poll -Server für neue Nachrichten in der Warteschlange / Push die neuen Nachrichten über Comet überschreiten.
  3. Aktualisieren Sie die GUI, wenn es neue Nachrichten gibt.
  4. Spülen, Schaume, wiederholen

Die Verwendung eines echten IM -Servers wie Ejabberd könnte einen langen Weg zurücklegen, effizienter sein und Ihren Benutzern über Desktop -Clients eine Verbindung herstellen (falls Sie dies möchten). Ich würde das wahrscheinlich als Backend verwenden, Iow Ejabberd wäre der Server und PHP würde der Client verwenden XMPP in PHP, und fungiere als Proxy für den Webgui.

Siehe auch:
Google TechTalk über die Chat -Funktion von Google Mail (und Skalierbarkeitsprobleme)

Das sind meine $ 0,02

Solange es keine HTTP -Push -Technologie gibt JavaScript.

Mögliche Arbeitskräfte:

  • verwenden ein Flash Film oder a Java Applet zur Durchführung einer Sockelkommunikation
  • Halten Sie die Wahlanfragen für einige Sekunden lang auf der Serverseite zurück

Sie könnten WebSockets verwenden, aber eine neue HTML5 -Funktion ist ein bisschen begrenzt. Glück für Sie gibt es Socken, was Websockets auf Browsern implementiert, die nicht damit umgehen.

Auf der Hosting -Seite sollten Sie in der Lage sein, einen WebSockets -Server zu verwenden. Es gibt einige für PHP.

Wenn Sie einen Chat -Server implementieren möchten, der mit einer Skriptsprache wie PHP/JSP geschrieben wurde, muss die Technik zum Hängen von HTTP -Verbindung von Ihrer Optionsliste abgehängt werden. Der Grund sind die meisten Web -Severs (speziell gemeinsam genutzte Hosts) mögen nicht zu viele Verbindungen, die hängen.

Sie finden alles, was Sie benötigen, um einen Web -Client und einen PHP -Chat -Server in diesem zu implementieren "Optimiertes Chat -Server -Protokoll für Server -Seiten -Skriptsprachen" Veröffentlichung.

Die beste Strategie, die ich gesehen habe, ist, eine AJAX -Anfrage nach Nachrichten zu machen und dann genau diese Anfrage neu zu starten, sobald sie beendet ist.

Machen Sie auf der Serverseite das Skript für 60 Sekunden oder bis eine neue Nachricht empfangen. Dies hält die gleiche Verbindung für ein maximal 60 Sekunden offen, aber wenn eine neue Nachricht empfangen wird, gibt sie sie aus und stoppt sofort, was den Client-Side-Ajax dazu veranlasst, eine andere Verbindung zu öffnen.

Dies bietet eine fast sofortige Benachrichtigung neuer Nachrichten und ist auch auf dem Server viel einfacher als alle x Sekunden eine neue Verbindung herzustellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top