Ajax Chat - nur aktualisieren, wenn es eine Änderung gibt

8

Ich habe derzeit einen Ajax-basierten Chat, den ich zu straffen versuche, indem ich nur das Chat-Skript lade, wenn ein Update stattfindet. Daher muss nichts weiter geladen werden, wenn sich in der Datenbank nichts geändert hat.

Meine aktuelle Logik sagt:

  • Die JavaScript-Funktion wird alle 1/2 Sekunde ausgelöst, um Chat-Protokolle ( setInterval() )
  • zu erhalten

Wenn sich jedoch nichts geändert hat, erscheint es ziemlich ineffizient, es weiter anzurufen. Stattdessen möchte ich Folgendes tun:

  1. Die JavaScript-Funktion prüft, ob neue Protokolle in der Datenbank vorhanden sind
  2. Wenn JA - laden Sie die neuen Protokolle, wenn NEIN - lassen Sie die aktuell angezeigten Protokolle in Ruhe.

Wie würde ich darüber gehen? Die Funktion, die ich momentan verwende, ist:

%Vor%     
Dave 11.06.2010, 17:34
quelle

5 Antworten

3

Ich würde timestamp s (oder message_id s) zusammen mit allen Chat-Nachrichten übergeben, die das serverseitige Skript an einen Client sendet. Dann fragt der Client einfach nach neuen Nachrichten und der Server sendet nur, was neu ist.

Stellen Sie sich vor, dass jede Chat-Nachricht eine ID hat. Ich würde mein chat.php entwerfen, um einen Parameter wie folgt zu akzeptieren:

%Vor%

12345 wäre id der letzten Nachricht, die der Client gesehen hat. chat.php macht im Wesentlichen Folgendes:

%Vor%

... und übergibt eine nette kleine Datenstruktur (ein Array von Objekten, in JSON kodiert, sagen wir mal).

Wenn also keine neuen Chat-Nachrichten vorhanden sind, gibt der Server nur ein leeres Array zurück.

Ich glaube nicht, dass Sie effizienter sein können.

BEARBEITEN:

Mir ist klar, dass es ein wenig mehr clientseitige Codierung erfordert, wenn man so vorgeht. Du aktualisierst nicht mehr nur ein div mit dem gesamten Chatverlauf. Sie müssen auch einen Handler für Ihren Ajax-Aufruf haben, der die Ergebnisse iteriert und für jede Nachricht programmatisch ein div für diese Zeile erstellt und dann an Ihren Chat div anfügt.

    
timdev 11.06.2010 18:01
quelle
1

Ein relativ einfacher Weg, dies zu tun, ist AJAX zu verwenden, um eine Seite zu holen, die Ihnen einfach sagt, ob es irgendwelche Aktualisierungen gegeben hat. So könnten Sie beispielsweise eine Seite wie checkForUpdate.php mit einer 1 oder einer 0 abrufen, um anzuzeigen, ob es im Chat etwas Neues gibt. Wenn du eine 1 zurückbekommst, kannst du die komplette chat.php Seite laden.

(Wenn Sie AJAX vorher noch nicht benutzt haben, ist dies ein ziemlich gutes Tutorial: Ссылка )

Eine andere Lösung (und eine, die meiner Meinung nach wahrscheinlich besser ist) ist das Laden einer Seite, die nur die neuesten Chat-Zeilen enthält. Angenommen, Sie zeigen gerade die Zeilen 1-14 des Chats an. Sie könnten dann AJAX verwenden, um den Inhalt von beispielsweise getLines.php?s=14 abzurufen. Diese Seite würde nur die Zeilen des Chats nach Zeile 14 anzeigen. Sie würden diese Zeilen dann einfach an das Ende des aktuellen Chat-Fensters anhängen.

    
Computerish 11.06.2010 17:44
quelle
0

Wie Sie wissen, füllt die .load-Funktion ein Element mit der Ausgabe Ihrer chat.php-Datei. Diese .load-Funktion führt zwei Schritte aus: Sie stellt eine Ajax-Anfrage an die chat.php und setzt dann den Wert des Elements auf die Ausgabe von chat.php. Was Sie tun möchten, ist nur der erste Schritt. Verwenden Sie dazu die .ajax-Funktion

Ссылка

Anstatt die Datei chat.php zu verwenden, würde ich vorschlagen, ein anderes Skript wie isChatUpdated.php aufzurufen. Das Skript wird genau so funktionieren, wie es der Name andeutet, und überprüfen, ob es irgendwelche Änderungen im Chat gegeben hat. Sie können dieses Ergebnis dann verwenden, um herauszufinden, ob Sie Ihre .load-Funktion aufrufen müssen.

    
The Real Diel 11.06.2010 17:42
quelle
0

In beiden Fällen müssen Sie die db auf der Serverseite abfragen. Dies ist fast irrelevant, wenn sie Protokolldaten oder einen einzelnen Wert zurückgibt.
Sie können entscheiden, #chatArea nicht basierend auf einem Rückgabewert zu aktualisieren, aber Sie müssen andernfalls einen anderen Aufruf durchführen, um die Protokolle abzurufen.

    
Poliveira 11.06.2010 17:43
quelle
0

Ich würde zuerst eine Datei namens messages.php erstellen, die ungefähr so ​​aussieht:

%Vor%

Dann auf der Client-Seite mit jQuery oder so etwas würde ich so etwas tun:

  1. Erhalten Sie Nachrichten mit etwas wie $.post('messages.php', new_messages_handler)
  2. Im Handler würde ich html für jede neue Nachricht erstellen, die wir zurückbekommen haben, und sie an den Chat-Container anhängen / voranstellen sowie speichern, zu welcher Zeit die letzte Nachricht erstellt wurde.
  3. Warten Sie eine Weile
  4. Erhalte neue Nachrichten mit etwas wie $.post('messages.php', {since: latest_datetime_we_have}, new_messages_handler)
  5. Gehe zu 2

Zumindest funktioniert es ziemlich gut in meinem Kopf: p

    
Svish 11.06.2010 18:41
quelle

Tags und Links