2009-06-08 6 views

Antwort

8

Nr Clients müssen "Umfrage" der Server ist.

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

Ideen:

1) Wenn der Benutzer eine Nachricht sendet, zeigen Sie sie direkt in den Chat und eine Umfrage auslösen.

2) Wenn eine Umfrage mit mehreren Nachrichten von anderen Benutzern zurückkommt, fügen Sie sie nicht alle auf einmal hinzu, fügen sie tatsächlich über einen Zeitraum von 1-2 Sekunden oder so hinzu, mit zufälligem Abstand, so dass sie wie sie aussehen kommen "sofort" und unabhängig voneinander.(Wenn mehrere Nachrichten gleichzeitig eingehen, stellt der Benutzer schnell fest, dass der Chat dort aktualisiert wurde und nicht fortlaufend.)

3) Wenn der Benutzer für eine bestimmte Zeit inaktiv ist. Lassen Sie die Pollrate einmal alle 10 Sekunden fallen.

4) Wenn der Benutzer aktiv ist, dh viele Nachrichten senden, häufiger abfragen.

5) Haben Sie eine statische Datei für jeden Kanal, in dem Sie die Zeit schreiben, zu der der Chat zuletzt aktualisiert wurde. Zum Beispiel hat Datei chat-teenfun-lastupdate.txt den Inhalt 1224934239 oder welches Zeitformat Sie bevorzugen. Dienen Sie dieser Datei statisch, und lassen Sie die Clients diese Datei abfragen, um zu überprüfen, ob der Kanal aktualisiert wurde, und rufen Sie stattdessen chat-poll.php?ch=teenfun auf, der eine dynamische Überprüfung durchführt. Statische Dateien werden abhängig von der Arbeit, die für das dynamische Skript erforderlich ist, etwa 10 bis 100 Mal schneller bereitgestellt. Sie benötigen sie, wenn Sie mehr als 250 Benutzer anfragen.

Viel Glück und viel Spaß!

/0

PS. Alternativ könnten Sie Clients auch einen Ajax-Aufruf an den Server senden lassen und sie "hängen" lassen. Das heißt, Sie akzeptieren ihre Anfrage und tun so, als würden sie anfangen, Daten zurückzusenden, aber dann pausieren Sie einfach. Wenn etwas passiert, beenden Sie die Antwort mit den entsprechenden Daten. Damit dies funktioniert, glaube ich, dass Sie Ihren eigenen HTTP-Server schreiben müssen, der das speziell tut, da Sie nicht 250 PHP-Prozesse im Speicher haben können. Vielleicht könnte Lighttpd auf diese Weise irgendwie mit diesem LUA-Cache-Mod verwendet werden. Ich weiß es nicht. Wäre aber interessant. Hölle, ich muss es irgendwann versuchen :)

1

Solange es keine HTTP-Push-Technologie gibt, erhalten Sie nie einen Echtzeit-Chat nur mit .

Mögliche workarrounds:

  • verwenden, um einen Flash Film oder eine Java Applet einige Socket-Kommunikation
  • halten Abfrageanforderungen zurück auf der Server-Seite für einige Sekunden
+1

Sie wissen, dass hier einige reale Beispiele solcher Dinge in PHP/JS sind? Ich schreibe auch einen für meinen Job, ja, es hat seine Grenzen, aber es ist nicht unmöglich. Auch ohne Push-Technologie. – elcuco

+0

Realtime bedeutet für mich Echtzeit (außer Verbindungsgeschwindigkeit) ... aber du hast Recht: da draußen gibt es viele Dinge, die sich echt anfühlen ... – TheHippo

+0

Ich glaube, letzteres ist der Ansatz, den Facebook Messenger benutzt.Es ist vielleicht nicht unbedingt so elegant wie ein herkömmlicher Client-Server-Ansatz, aber es erledigt die Aufgabe. – Rob

6

Sicher gibt auszuführen ist , aber ich denke nicht, dass es bei vielen Benutzern sehr effizient sein wird. Sie können entweder abfragen, wo jeder Client den Server abfragt, um zu sehen, ob neue Nachrichten vorhanden sind, oder Sie können die comet technique verwenden, in der der Server neue Nachrichten an die Clients senden kann - Überprüfen Sie die Comet plugin for XAJAX. Wie dies mit XAJAX und PHP implementiert werden kann, ist mir ein Rätsel, aber hier würde ich versuchen, es zu implementieren.

jeder Client zum Server Lassen Sie verbinden (anmelden etc), dann gilt:

  1. Für jede Nachricht von einem Client (Absender) gesendet für Client die Nachrichtenwarteschlange aktualisieren (Empfänger)
  2. Client Umfrage Server Let für neue Nachrichten in der Warteschlange/Push die neuen Nachrichten über Komet.
  3. GUI aktualisieren, wenn neue Nachrichten vorhanden sind.
  4. spülen, schäumen, wiederholen

einen echten IM-Server wie ejabberd verwenden könnte ein langer Weg, effizienter sein und lassen Sie Ihre Benutzer über Desktop-Clients verbinden (wenn das, was Sie wollen). Ich würde das wahrscheinlich als Backend verwenden, IOW ejabberd wäre der Server und PHP wäre der Client, der XMPP in PHP verwendet und als Proxy für den Webgui fungiert.

Siehe auch:
Google Techtalk on Gmail's chat feature (and scalability issues)

Das repeatadly my $ 0,02

0

Die beste Strategie, die ich gesehen habe, ist eine AJAX-Anfrage für Nachrichten und dann starten Sie genau diese Anfrage, sobald es fertig ist.

Auf der Server-Seite, machen Sie das Skript für 60 Sekunden oder bis eine neue Nachricht empfangen wird. Dies hält die Verbindung für maximal 60 Sekunden offen, aber wenn eine neue Nachricht empfangen wird, gibt sie sie aus und stoppt sofort, was die clientseitige AJAX dazu auffordert, eine weitere Verbindung zu öffnen.

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

1

Sie könnten Websockets verwenden, aber als neues HTML5-Feature ist es irgendwie begrenzt. Zum Glück gibt es socksjs, die Websockets in Browsern implementiert, die nicht damit umgehen.

Auf der Hosting-Seite sollten Sie in der Lage sein, jeden WebSockets-Server zu verwenden, es gibt ein paar für PHP.

+0

gibt es buchstäblich keinen großen Browser, der WebSockets nicht unterstützt: http://caniuse.com/#feat=websockets – specializt

1

Wenn Sie einen Chat-Server implementieren möchten, der mit einer Skriptsprache wie PHP/JSP geschrieben wurde, muss die Technik zum Aufhängen der HTTP-Verbindung in Ihrer Optionsliste angekreuzt sein. Der Grund ist, dass die meisten Web-Server (speziell Shared Hosts) nicht zu viele Verbindungen hängen mögen.

In dieser Publikation "Optimized Chat Server Protocol for Server Side Scripting Languages" finden Sie alles, was Sie zur Implementierung eines Web-Clients und eines PHP-Chat-Servers benötigen.