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:
setInterval()
) Wenn sich jedoch nichts geändert hat, erscheint es ziemlich ineffizient, es weiter anzurufen. Stattdessen möchte ich Folgendes tun:
Wie würde ich darüber gehen? Die Funktion, die ich momentan verwende, ist:
%Vor% 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:
12345
wäre id
der letzten Nachricht, die der Client gesehen hat. chat.php
macht im Wesentlichen Folgendes:
... 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.
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.
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.
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.
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:
$.post('messages.php', new_messages_handler)
$.post('messages.php', {since: latest_datetime_we_have}, new_messages_handler)
Zumindest funktioniert es ziemlich gut in meinem Kopf: p
Tags und Links javascript php ajax chat