2016-04-05 3 views
1

Ich arbeite gerade an einem Chat-System, um mich als Programmierer zu verbessern, da ich noch jung bin (17). Wenn sich ein Benutzer anmeldet, wird die Nachricht "{user} hat den Chat betreten". wird im Chat angezeigt. Wenn sich ein Benutzer abmeldet, hat die Nachricht "{user} den Chat verlassen". wird angezeigt.Wie man feststellt, wann ein Benutzer eine Seite offiziell verlassen oder betreten hat

Beide Funktionen funktionieren einwandfrei. Ich möchte aber auch feststellen, wann ein Benutzer die Seite schließt (Nachricht hinterlassen) und wann er zurückkommt (Nachricht eingeben).

Um dies zu erreichen etwas, ich folgendes:

1, auf der Haupt-Chat-Seite (chat.php), habe ich eine Sitzung namens onpage

2, wenn ein Benutzer die Blätter Seite das folgende Skript in einem onbeforeunload Ereignisse durch AJAX (jQuery) läuft:

//setoffline.php 

    unset($_SESSION["onpage"]); // unset the session 
    if ($_POST['logout'] == "false") { // in our case, this will evaluate true 
     sleep(3); // halt the script for 3 seconds 
     if (isset($_SESSION["onpage"]) || !empty($_SESSION["onpage"])) 
      die(); 
     } 
    } 
    // if continued, send the offline message 
    ... 
    $_SESSION["left"] = "true"; 

3, das Skript ausgeführt wird, und schläft dann für drei Sekunden, bevor die Überprüfung, ob die Sitzung noch existiert (wenn der Benutzer innerhalb von drei zurück Sekunden die Sitzung wäre zurückgesetzt worden). Wenn dies nicht der Fall ist: Das Skript wird abgeschlossen, die Abwesenheitsnachricht wird gesendet und die Sitzung left wird eingerichtet.

4, Wenn der Benutzer zurückkehrt, wird eine Onload-Funktion ausgelöst, die nach der Sitzung left sucht. Ist dies der Fall, wird die Nachricht "Enter" gesendet und die Sitzung left wird deaktiviert.

Das Problem:

Inzwischen bin ich sicher, dass Sie ein Problem mit meinem Algorithmus identifiziert haben. Ich sehe selbst viele Probleme. Zum einen scheint die Verwendung der sleep Funktion nicht richtig, noch funktioniert es richtig. Es funktioniert korrekt beim Schließen der Seite (weil niemand innerhalb von 3 Sekunden zurückkehrt), aber wenn Sie aktualisieren, wird die Seite für die drei Sekunden angehalten, die ich nicht möchte. Ich möchte einfach einen Weg finden, um festzustellen, wann ein Benutzer offiziell die Seite verlassen und konjugiert auf die Seite zurückgekehrt ist.

+0

Ist Ihnen bewusst, dass jeder Benutzer seine eigene Sitzung hat? – delueg

+0

Das ist nicht das Problem. Wenn ein Benutzer die Seite schließt, wie wird die Tatsache, dass jeder Benutzer eine eigene Sitzung hat, dazu beitragen, dass mein Benutzer benachrichtigt wird, dass der Benutzer den Chat verlassen hat? @delug – Shawn31313

+0

Wie aktualisierst du den Browser, wenn eine neue Chat-Nachricht eingeht? Eine Art Umfrage? Vielleicht könnten die Abrufdaten auch eine Liste von Benutzern zurückgeben, die im Chat angemeldet sind. Dann können Sie überprüfen, welche den Chat verlassen haben. (Verwenden Sie onbeforeunload, um einen Befehl zum Anmelden des Benutzers zu senden, oder markieren Sie ihn als den Chat verlassen). –

Antwort

1

Die beste Lösung ist, dass ein Anruf AJAX an den Server nach jeweils 5 oder 10 Sekunden. Diese AJAX-Anfrage ändert den letzten Online-Status (datetime) in der Server-DB in Bezug auf jeden Benutzer, der die Seite in seinem Browser geöffnet hat.

Wenn er die Seite verlässt, tun Sie nichts. In diesem Fall wird die AJAX-Anfrage nicht angerufen und die letzte Online-Zeit wird nicht aktualisiert.

Jetzt andere Seite, wo Sie zeigen, dass Benutzer ist online gegangen und hat offline geht. Hier ist eine weitere Ajax-Anfrage (alle 5 oder 10 Sekunden), um Daten vom Server zu holen, die bestimmen, wer vor 5 oder 10 Sekunden online war. Je nach vergangenem Status und aktueller Statistik des Benutzers können Sie den Status von online/offline für jeden Benutzer bestimmen.

Ich hoffe, Sie verstehen.

0

Eine Option, wie in einer anderen Antwort erwähnt, wäre, dass jeder Client den Server in bestimmten Intervallen abfragt. Der Server würde dann annehmen, dass jeder Client, der kürzlich nicht abgefragt hat, "gegangen" ist. Ein großer Nachteil dieses Ansatzes besteht darin, dass viel Bandbreite benötigt wird.

Ein anderer Ansatz wäre, die Logik zu verschieben, die bestimmt, wann die Nachricht in jedem Client angezeigt werden soll. Wenn ein Benutzer den Raum verlässt, benachrichtigt der Server irgendwie alle anderen in dem Raum, den die Person verlassen hat.Anstatt dass der Client diese Nachricht sofort anzeigt, könnte er eine setTimeout verwenden und dann prüfen, ob der Server eine weitere Nachricht gesendet hat, die besagt, dass derselbe Benutzer zurück im Raum ist. Sie können ein data-Attribut in einem HTML-Block verwenden, der dem Benutzer zugeordnet ist, um aufzuzeichnen, dass er möglicherweise noch vorhanden ist und zurückgegeben wurde.


Soweit wie die Verbindungen zwischen den verschiedenen Kunden zu halten und dem Server ich empfehlen würde in eine Technik suchen genannt BOSH.

Die wikipedia page bietet eine wirklich gute Einführung in das, was BOSH ist und warum es besser als andere Alternativen sein kann, wie zum Beispiel das ständige "Polling" des Servers.

Verwandte Themen