Hey Leute, ich habe mal eine Frage zu der Session Cookie Lifetime (session_set_cookie_params)
Unzwar habe ich ein Skript geschrieben, was gucken soll ob der User länger als 6 Stunden lang online war und wenn das der Fall ist soll es den User abmelden, das sieht folgendermaßen aus:
[PHP]function testTimeout() {
global $session_user_id;
$AlleUsers = allOnlineUsers();
if (empty($AlleUsers) === false) {
foreach($AlleUsers as $user_extract) {
$user_id = $user_extract[‚user_id‘];
$LastSeen = mysql_result(mysql_query(„SELECT lastSeen FROM users WHERE user_id = $user_id“), 0, ‚lastSeen‘);
$lastSeenDate = strtotime($LastSeen);
$DateNow = time() - (36060);
if ($lastSeenDate <= $DateNow) {
if ($user_id == $session_user_id) {
offline($session_user_id);
lastSeen($session_user_id);
session_destroy();
echo „“;
} else {
offline($user_id);
lastSeen($user_id);
}
}
}
}
}[/PHP]
Kommen wir nun zu meiner Frage…
Es passiert leider ziemlich oft, dass der User schon nach einer Stunde oder noch schneller ausgeloggt ist und ich weiß nicht wieso, bzw. woran es liegen könnte…
[PHP] global $session_user_id;[/PHP]
AUA! Globals sind keine gute Idee
Warum dann
[PHP] $AlleUsers = allOnlineUsers();[/PHP]
wenn es nur um einen geht?
[PHP]$LastSeen = mysql_result(mysql_query(„SELECT lastSeen FROM users WHERE user_id = $user_id“), 0, ‚lastSeen‘);[/PHP]
So ein Konstrukt sollte man vermeiden, ist unübersichtlich und erschwert die Fehlersuche
Außerdem ist die MySQL-Erweiterung veraltet, nutze MySQLi oder PDO
[PHP]$DateNow = time() - (36060);[/PHP]
Du redest von 6 Stunden, rechnest aber nur mit 3
Mein Tipp: Script vernichten und nochmal neu schreiben
Also ohne nun auf dein Script genau einzugehen, bist du denn sicher, dass der Benutzer von deinem Script durch das session_destroy() zu früh ausgeloggt wird. Wenn ja, dann würde ich einfach die Events aus dem Script in eine Datei protokollieren und mir die entsprechenden Daten wie $lastSeenDate, $DateNow, … wegschreiben. Dann siehst ja, wann was und warum passiert.
Ich glaube, wie @btd600 schon gesagt hat, hat es mehr Sinn dieses Skript komplett neu zu schreiben.
Da ich keine Ahnung habe, wonach man da googlen soll oder so wende ich mich hier dran. Hat jemand Links oder direkte Voschläge, wie man sowas am besten und sichersten Angehen kann?
Mein Plan ist es 1. zu prüfen, ob der Nutzen online ist (keine Ahnung wie die das hier z.b. gemacht haben…) und 2. zu prüfen, ob er seit 6 Stunden eingeloggt ist und ihn dann ausloggen…
Da fängt das schon an, eine wirklich sichere Methode gibt es dafür nicht. Auch in diesem Forum sind das nur Mutmaßungen und keine sicheren Aussagen.
Es kann kann ja sein, dass ich vor 4 Stunden auf deiner Seite war, dann drei Stunden nicht und jetzt wieder, wie willst du dabei vorgehen? Wenn der User sich nicht ausloggt, bekommst du das garnicht mit.
Weißt du denn, wie es hier gemacht wird? oder irgendeinen Ansatz?
Ja genau da sind halt meine Probleme @bdt600, am Liebsten ist es mir einfach, dass wenn ein User irgendwie z.B. 3 Stunden lang nicht aktiv war, dass er dann ausgeloggt wird…
Nun habe ich keine Ahnung wie das gehen soll, zumal da ja deine angesprochenen Probleme dazu kommen, die mir auch schon in den Sinn bekommen sind…
Mit Sessions kommst du da nicht weit, da eine Session nach einer serverseitig vorbestimmten Zeit als Datenmüll eingestuft wird. Halbwegs brauchbar bekommst du das nur mir Cookies hin.
Bei jedem Klick eines User setzt du einen Keks mit dem aktuellen Timestamp und speicherst diesen gleichzeitig in einer Datanbank ab. Wenn der User 3 Stunden nicht aktiv war, wird der Keks ungültig und er muss sich wieder einloggen. Weiterhin baust du in jeder Seite einen Teil ein, der alle User aus der Tabelle rauswirft, deren letzter Timestamp als 3 Stunden alt ist.
Ja, dass das die deutsche Übersetzung ist hätte ich mir jetzt fast gedacht…
Ich habe noch eine Frage dazu, wenn ich Kekse verwende…
Wie muss ich das kentlich machen, so ne Anzeige schreiben mit „Diese Website verwendet Kekse, Akzeptiers“ und dazu noch in den Datenschutz?
Oder wie muss man das kenntlich machen?
EDIT:
Und bei dem „Online-System“ muss ich mit Ajax arbeiten, oder? Wegen einer onclick-function?
Ist denn nicht Onclick oder Onmousemove oder so besser?
Was ist denn bei einem Chat oder so? Da wird ja die Seite nicht neu geladen…
Meine Idee war es einfach, das Script dann in die index.php-Datei zu inkludieren, die bei jeder Seite aufgerufen wird (außer bei Ajax-Requests, wie bei Chats)
Unsicher bin ich mir deswegen bei den Sachen wie Chats