2009-08-03 4 views
1

Momentan, in meinem PHP-Skript, nachdem ein Benutzer angemeldet war, speicherte ich session_login = 1. Aber ich habe ein Problem. Ich habe eine Angewohnheit in Firefox, Multi-Tab (ich glaube, die meisten Menschen und alle heutigen Web-Browser-App haben Multi-Tab-Funktion). Ich habe den Tab geschlossen, der die Sitzung enthält, aber ich habe den Browser nicht geschlossen. Nach ein paar Stunden komme ich auf die gleiche Seite zurück, auf der ich mich anmelden muss, aber das tut es nicht. Es erfordert nicht, dass ich mich erneut anmelde (ich glaube, das nennt man "Session"). Gibt es trotzdem eine Abmeldung des Benutzers, wenn er den Tab schließt anstatt den Browser zu schließen ??Wie kann man einen Benutzer in PHP ausloggen?

Ich habe 1 Lösung gerade jetzt, Zeit-Leerlauf kick out. Aber, ich habe sehr begrenzte Kenntnisse in Datum/Zeit-Sache in PHP, so dass dies die letzte Option wäre. Ich wollte wissen, gibt es noch etwas, das ich tun kann, außer Zeit zu verbrauchen?

+0

Wenn Ambers Antwort verwenden, werden Sie eingeloggt sein, wenn Sie * keine Aktivität haben * für eine Stunde. Die Registerkarte kann im Browser * noch geöffnet * sein, aber wenn Sie nichts tun, wird Sie automatisch abgemeldet * ohne Eingabeaufforderung *. Stellen Sie sich eine Situation vor: Sie haben ein Formular für eine Stunde auf der Seite geöffnet, und nachdem Sie die Daten übermittelt haben, finden Sie heraus, dass Sie bereits ausgeloggt sind. Oder nach einer Kaffeepause drücken Sie einen Link und werden rausgeschmissen. Ich denke, das wird ein Usability-Problem – Dan

+0

Bitte testen Sie Ihr Projekt noch einmal, um zu sehen, ob ich richtig oder nicht bin – Dan

+0

Vielleicht könnten Sie das gleiche Usability-Problem bei der Verwendung von PHPMyAdmin sehen, wenn Sie unerwartet abgemeldet wurde – Dan

Antwort

2

PHP hat eine einfache Möglichkeit, festzulegen, wie lange eine Sitzung dauern wird, bevor es mal aus:

session_set_cookie_params(3600); // make it expire after 1 hour 

Gerade sie die Anzahl der Sekunden verstreichen Sie die Sitzung (im Beispiel 1 Stunde dauern soll = 60 Minuten = 3600 Sekunden).

http://us2.php.net/manual/en/function.session-set-cookie-params.php

+0

Diese Methode funktioniert für aktuelle Projekt (lösen mein Problem vorübergehend). Aber nächstes Projekt muss ich möglicherweise Richy C Antwort verwenden, weil der Benutzer für mehr als 1 Stunde auf meiner Website bleiben kann. Schwer zu wählen beste Antwort. Nun, ich wähle die beste Antwort basierend auf der "Abstimmung" – bbtang

+0

Ihre Methode wird den Benutzer abmelden, wenn es für eine Stunde keine Aktivität gab (auch bei geöffneter Registerkarte).Aber die Frage war, den Benutzer auszuloggen, wenn er einen Tab schließt. PS – Dan

+0

IMO, nur AJAX-Anfragen wiederholen alle N Minuten kann die Aufgabe lösen – Dan

2

Eine Session-Cookie nur aus dem Browser gelöscht, wenn die Browser-Sitzung geschlossen ist (das heißt, wenn der Browser geschlossen wird): daher der Name. Wenn Sie möchten, dass die Sitzung kurz nach dem Schließen der Registerkarte beendet wird, können Sie eine sehr kurze Ablaufzeit für den Cookie festlegen (etwa 5 Minuten) und diese in der Datenbank speichern. Dann haben Sie eine JavaScript-Funktion auf der Webseite, die jede Minute eine Datei von Ihrem Server aufruft: Diese Datei "aktualisiert" den Cookie/Datenbank-Eintrag für die nächsten fünf Minuten. Wenn sie Ihre Website länger als fünf Minuten verlassen, wird die Sitzung ungültig.

Sie können auch eine Javascript "onunload" -Funktion hinzufügen, die erkennt, ob sie die Webseite geschlossen oder zu einer anderen Seite gegangen ist: Sie könnten einen Haken hinzufügen, um eine "destroycookie" -Funktion aufzurufen - aber Sie müssen Vergewissern Sie sich, dass sie nicht gerade auf eine andere Seite Ihrer Website gegangen sind und dass nicht wirklich zwei Seiten Ihrer Website auf zwei Registerkarten geöffnet sind.

+0

Das klingt cool. Aber leider kenne ich JavaScript nicht. – bbtang

+0

Oh ya, btw, du hast erwähnt, dass "jede Minute eine Datei von deinem Server angerufen wird", wenn ich 1000 oder mehr Benutzer gleichzeitig angemeldet habe, bedeutet das jede Minute, die mein Server auf diese 1000 ++ Benutzer antworten muss Ich richtig? Wird es meine Serverleistung verlangsamen? Gibt es einen besseren Weg? – bbtang

+0

Eine Kombination aus http://www.quirksmode.org/js/xmlhttp.html und setInterval (sendRequest ('refresh.php'), 60000); um die "refresh.php" jede Minute (6000 Millisekunden) zu holen, sollte die Aufgabe erledigen. –

0

Ich glaube, die Option, nach der Sie suchen, ist die Einstellung für den Ablauf des Sitzungscookies. Ich erinnere mich nicht an den PHP-Befehl dafür, aber Sie sollten in der Lage sein, den Cookie so einzustellen, dass er abläuft, wenn das Fenster geschlossen wird. Hier

ist die PHP-Session-Dokumentation: http://us2.php.net/manual/en/book.session.php

+0

Danke für den Link, werde ich auf jeden Fall gehen und einen Blick auf – bbtang

0

Vielleicht könnten Sie session_write_close()?

+0

Ich bin völlig ahnungslos über session_write_close(). Ich bin ein neuer PHP-Programmierer. Ich werde das hier überprüfen. Danke – bbtang

0

Es gibt einen Kommentar über die PHP-Dokumentation für die session_destroy Funktion, die Ihnen nützlich sein könnten: http://us2.php.net/manual/en/function.session-destroy.php#71889

+0

Ich benutze normalerweise die session_destroy nur auf der Abmeldeseite. Ähm, nun, lass mich darüber nachdenken, ich glaube es könnte in irgendeiner Weise nützlich sein und könnte mein Problem lösen .. Fokus, Fokus, Fokus .. denke, denke, denke .... – bbtang