2009-05-20 6 views
8

Nachdem sich der Benutzer erfolgreich angemeldet hat, speichere ich login = true in der Datenbank. Aber wie überprüfe ich, ob der Benutzer sich abgemeldet hat, indem ich den Browser geschlossen habe, ohne auf den Logout-Button zu klicken? Und wie kann ich Benutzer, die für 10 Minuten inaktiv waren, auf die Anmeldeseite umleiten?Wie erkennen, ob ein Benutzer ausgeloggt ist, in PHP?

Ich benutze PHP und MySQL. Jede Hilfe wäre willkommen.

EDIT: Sorry, wenn meine Frage nicht klar ist. Ich habe Sitzung verwendet, um zu speichern, ob sie eingeloggt sind oder nicht. Aber jetzt möchte ich die Informationen in der Datenbank speichern, damit ich ihren Status auf anderen Seiten anzeigen kann. Angenommen, user1 hat 3 Freunde. Bei der Anzeige aller seiner Freunde möchte user1 wissen, ob seine Freunde online oder offline sind. Das ist was ich will. Irgendwelche Ratschläge?

+0

möglich Duplikat [Informationen von MySQL-Tabelle entfernen, wenn der Benutzer seinen Browser schließen] (http://stackoverflow.com/questions/2195581/remove-information-from-mysql -table-wenn-user-close-his-browser) – Quentin

Antwort

0

Es könnte besser sein Login = true in einer Sitzungsvariablen zu speichern, um zu überprüfen wheter oder nicht der Benutzer angemeldet ist dies die meisten Ihrer Probleme lösen würde.;)

0

Normalerweise würden Sie diese Informationen in Sitzungen setzen.

$_SESSION['user'] = "A user name"; 

Dann, wenn Sie möchten, dass Sie tun, um die Abmeldung:

session_destroy(); 

Einige weitere Informationen über Sitzungen here und ein tutorial.

+0

ich weiß. Aber wenn der Benutzer den Browser schließt? Meine Datenbank bleibt immer noch der Status ist wahr oder? Ich möchte anzeigen, ob der Benutzer online oder offline ist. –

+0

Der Status sollte ein Datum sein, dann jedes Mal, wenn der Benutzer etwas tut, können Sie dieses Feld aktualisieren.Wenn der Benutzer in der letzten halben Stunde aktiv war, könnte er sagen, dass er eingeloggt ist. Oder etwas Ähnliches. – MrHus

0

Warum verwenden Sie keine Sitzung oder Cookies für diese, anstatt es in die Datenbank einzufügen. Sie können die Cookies setzen, indem Sie die Funktion setcookie() verwenden, oder Sie können entweder eine Sitzung verfügbar machen und den Wert darin speichern.

13

2017 edit: In diesen Tagen, die beste Wahl ist WebSockets mit Präsenz auf einer Seite/Website zu verfolgen.


Sie können nicht erkennen, wenn ein Benutzer den Browser schließt oder Ihre Website mit PHP navigiert weg, und die JavaScript-Techniken, dies zu tun sind so von weitem garantiert als nutzlos.

Stattdessen speichert Ihre beste Wette wahrscheinlich die letzte Aktivitätszeit jedes Benutzers.

  • Erstellen Sie eine Spalte in Ihrer Benutzertabelle in der Zeile 'last_activity'.
  • Wenn ein Benutzer eine Seite lädt, aktualisieren Sie ihre Last_activity auf die aktuelle Zeit.
  • Um eine Liste der Online-Benutzer zu erhalten, fragen Sie einfach die Datenbank nach Benutzern mit last_activity-Werten ab, die jünger sind als 10/20/was auch immer vor Minuten.
+1

Ich habe einmal die Methode verwendet, die Sie für ein Projekt beschrieben haben, und es funktioniert großartig. Sie können sogar die Datums- und Zeitfunktionen von mysql verwenden, wie timediff() und (time_to_sec (timediff (now(), last_activity))) um den Zeitraum anzuzeigen (letzte Aktivität: vor 15 Minuten). – stefs

+0

Das sieht so aus, dass die Datenbank sehr ausgelastet wird, wenn jede besuchte Seite die Datenbank aktualisieren muss. Gibt es einen leichten Weg wie Gumbo? Ich bekomme seinen Kommentar nicht sehr gut, verstehe ihn nicht sehr ... –

+0

Wenn Ihre Site so beschäftigt ist, dass eine zusätzliche Suchanfrage pro Seite Ihr System durchwühlt, ein "Wer ist online?" Die Seite wird so groß sein, dass sie sowieso nutzlos ist. Die Sitzungs-Methode von Gumbo funktioniert nicht für "Wer ist online?" Seite. – ceejayoz

1

Wenn Sie versuchen, die Benutzer zu verfolgen, die ‚online‘ sind dann könnten Sie eine Sitzung für die einzelnen Benutzer betrachten verwenden und stattdessen Login = true in der Db zu speichern ihren Status zu Ihnen oder anderen anzuzeigen, zu speichern die letzte Aktivitätszeit für den Benutzer. Wenn Sie Ihre Liste der Online-Benutzer aufrufen, erstellen Sie Ihre SQL-Abfrage, um nur Benutzer mit 'Last_activity' innerhalb der letzten 10 Minuten zurückzugeben.

0

AFAIK es gibt keine Möglichkeit für Sie zu überprüfen, wenn eine Person das Browserfenster schließt (oder verlässt Sie die Seite, um zu einem anderen zu gehen), so dass Sie Aktivität wie oben vorgeschlagen überprüfen müssen.

2

Sie fragen sich, ob Sie feststellen können, ob ein Benutzer seinen Browser geschlossen hat. Sie können irgendwie mit Javascript, aber ich würde nicht darauf verlassen (seit Javascript ist einfach zu deaktivieren) Aber Sie können nicht mit PHP, da PHP nur ausgeführt wird, wenn Sie eine Seite anfordern. Nicht wenn die Seite geöffnet ist.

Um sicher zu sein, sollten Sie die letzte Aktivität des Benutzers verfolgen und wenn es nach ein paar Minuten (5/10) ist, dann gehen Sie davon aus, dass der Benutzer weg ist. Wenn er aber wieder etwas macht (zum Beispiel nach 6 Minuten), ist er wieder online.

8

Speichern Sie den Zeitstempel jeder Aktivität des Benutzers. Wenn diese Zeit vor mehr als 10 Minuten ist, loggen Sie sich aus.

In PHP, könnten Sie so etwas tun:

session_start(); 
if (!isset($_SESSION['LAST_ACTIVITY'])) { 
    // initiate value 
    $_SESSION['LAST_ACTIVITY'] = time(); 
} 
if (time() - $_SESSION['LAST_ACTIVITY'] > 3600) { 
    // last activity is more than 10 minutes ago 
    session_destroy(); 
} else { 
    // update last activity timestamp 
    $_SESSION['LAST_ACTIVITY'] = time(); 
} 

Die gleiche Stelle auf der Datenbank durchgeführt werden kann. Dort könnte man sogar eine Liste von Nutzern bekommen, die "gerade" online sind.

+1

gilt dies für mehr als 1 Benutzer? Wenn ich 10 Benutzer auflisten möchte, 10 Benutzer online überprüfen möchten, wie geht das? –

+0

opps, sory .. ich weiß, wenn letzte Aktivität mehr als 10 Minuten, werde ich auf eine PHP-Seite umleiten, sagen meiner Datenbank, dass dieser Benutzer ausgeloggt wurde? ist das was du meinst? –

+0

Die Kommentare beschreiben die Bedeutung jedes Zweigs. Also "letzte Aktivität ist vor mehr als 10 Minuten" bedeutet, dass dieser Zweig eingegeben wird, wenn die letzte Aktivität mehr als 10 Minuten zurückliegt, also war er mehr als 10 Minuten inaktiv. Was das für Ihre Anwendungslogik bedeutet, ist Ihr Geschäft. – Gumbo

0

Dies ist eine Erweiterung zu dem, was 'ceejayoz' zuvor gesagt wurde.

Lassen Sie die Benutzer in regelmäßigen Abständen den Dienst pingen und sagen, dass sie noch angemeldet sind. Speichern Sie die letzte Ping-Zeit in der Sitzung. Wenn die letzte Ping-Sitzung länger als eine besagte Zeit ist, ping erneut, um zu sagen, dass die Anwendung noch aktiv ist.

Speichern Sie die Uhrzeit, zu der Sie den Ping in der Datenbank erhalten haben. Wenn der letzte empfangene Ping> der Keeplive-Schwellenwert ist, dann bedenken Sie, dass der Benutzer die Site verlassen hat.

Im Folgenden finden Sie einige nicht getestete Beispielcode für Sie beginnen mit. Mit "PING__FREQUENCY" können Sie steuern, wie oft die Benutzeraktivität die Spalte last_activity aktualisiert.

+0

Vorbehalt: Sie können DDoS Ihre Website auf diese Weise, wenn Sie eine große Anzahl von Benutzern haben – Piskvor

+0

True. Das ist nichts, was ich tun würde. Wird aber nur als Lösung für das in der Original Post beschriebene Problem angeboten. – StackKrish

0

IMHO der beste Weg ist, Zeitstempel der letzten Aktivität in DB bei jeder Aktualisierung des Benutzerdatensatzes zu speichern. Nach dem Abmelden oder Timeout (Timeouts mit Cronjob beibehalten) setze es einfach auf Null und benutze es als Flag.

$user = new User($user_id); 
$user->logged_in = (bool)($last_activity > 0); 

Manchmal müssen Sie etw sagen. like "last seen on ...", dann lass die letzte Aktivität und füge einfach ein boolesches Flag (tinyint) logged_in zu deiner Benutzertabelle hinzu.

0

Sie können dies mit einer Kombination von Möglichkeiten tun, höchstens 2 rate ich mit der letzten Aktivität, kombinieren Sie es mit jQuery, um auf Inaktivität zu überprüfen, das ist keine Maus oder Tastatur Ereignisse für einige Zeit Sagen Sie etwa 10 bis 20 Minuten, und sobald die Leerlaufzeit bestätigt ist, führen Sie einen AJAX-Aufruf an eine PHP-Datei durch, die Ihre Datenbanktabelle aktualisiert und den Benutzer offline anzeigt.

Sie können mit Start:

<script type="text/javascript"> 
idleTime = 0; 
$(document).ready(function() { 
//Increment the idle time counter every minute. 
var idleInterval = setInterval(timerIncrement, 60000); // 1 minute 

//Zero the idle timer on mouse movement. 
$(this).mousemove(function (e) { 
    idleTime = 0; 
}); 
$(this).keypress(function (e) { 
    idleTime = 0; 
}); 
}); 

function timerIncrement() { 
idleTime = idleTime + 1; 
if (idleTime > 19) { // 20 minutes 
    $.ajax({ 
    url: 'update_user.php', 
    type: 'POST', 
    datatype: 'json', 
    data: someData 
    }); 
} 
} 
</script>