In- en uitlogtijd van een sessie bijhouden
Ik maak een sessie aan als een user is ingelogt en hou de starttijd bij. Indien die op logout klikt is het gemakkelijk om bij te houden wanneer dit is gebeurd. Zover ben ik geraakt. Maar wat met users die zijn ingelogt en niet op de logout button hebben gedrukt? Kan ik bijhouden wanneer een sessie is verlopen en daarvan de eindtijd opslaan in mijn database?
Anders krijg ik het voorval dat users die op vrijdag inloggen en niet op logout klikken, de browser afsluiten diezelfde vrijdag en de maandagmorgen terugkomen en terug verder werken want de sessie is nog niet verlopen. Begrijpen jullie wat ik bedoel? Wie kan mij hier mee helpen?
Anders krijg ik het voorval dat users die op vrijdag inloggen en niet op logout klikken, de browser afsluiten diezelfde vrijdag en de maandagmorgen terugkomen en terug verder werken want de sessie is nog niet verlopen. Begrijpen jullie wat ik bedoel? Wie kan mij hier mee helpen?
Beste,
Wat je kan doen is, elke keer de ingelogde gebruiker van pagina verwisseld (een request naar de server stuurt), een veld in je tabel wijzigen namelijk: last_active.
Daarna is het aan jouw om te zeggen wanneer ze uitgelogd zijn. Stel dat iedere gebruiker na 5 minuten (nadat hij niets gedaan heeft) uitegelogd wordt.
Maar dit varieert van geval tot geval.
Stel:
gebruiker logt in: last_active is 7/06/2014 18:17 --> Uitgelogd om 7/06/2014 18:22
Gebruiker gaat naar de contactpagina: 7/06/2014 18:19--> Uitgelogd pas om 7/06/2014 18:24
Gebruiker gaat naar de homepagina: 7/06/2014 18:23 --> Uitgelogd pas om 7/06/2014 18:26
Enzover.
Dit is hoe ik het doe, maar er zullen waarschijnelijk nog andere manieren zijn !
Wat je kan doen is, elke keer de ingelogde gebruiker van pagina verwisseld (een request naar de server stuurt), een veld in je tabel wijzigen namelijk: last_active.
Daarna is het aan jouw om te zeggen wanneer ze uitgelogd zijn. Stel dat iedere gebruiker na 5 minuten (nadat hij niets gedaan heeft) uitegelogd wordt.
Maar dit varieert van geval tot geval.
Stel:
gebruiker logt in: last_active is 7/06/2014 18:17 --> Uitgelogd om 7/06/2014 18:22
Gebruiker gaat naar de contactpagina: 7/06/2014 18:19--> Uitgelogd pas om 7/06/2014 18:24
Gebruiker gaat naar de homepagina: 7/06/2014 18:23 --> Uitgelogd pas om 7/06/2014 18:26
Enzover.
Dit is hoe ik het doe, maar er zullen waarschijnelijk nog andere manieren zijn !
Gewijzigd op 07/06/2014 18:22:22 door - Diov -
Bedankt voor je reactie Diov. Maar het probleem is hiermee toch niet opgelost? Ik weet nog steeds niet wanneer een sessie is verlopen als de user niet op de logout drukt. Wat met users die hun browser laten open staan de vrijdagavond en de maandag terugkomen en verder werken? Ik kan jouw idee gebruiken maar dan heb ik een last_active op bvb de homepagina (de laatst bezochte pagina in jouw voorbeeld) maar geen einde van de sessie toch? Ofwel moet ik inderdaad de sessie laten verlopen als een user 5 minuten niks doet, maar die tijd heb ik toch ook niet? Vb. gebuiker gaat naar de homepagina: 7/06/2014 18:23 --> Uitgelogd pas om 7/06/2014 18:26 => daarna doet dit niks meer en na 5 minuten is hij automatisch uitgelogt. Dan is de tijd 18:26 ook niet juist meer toch?
Brecht S op 07/06/2014 19:07:49:
Ik weet nog steeds niet wanneer een sessie is verlopen als de user niet op de logout drukt.
En dat zul je ook nooit weten als er niet op logout wordt geklikt.
Enige oplossing is om het moment van "uitloggen" (niet meer actief zijn op de pagina/site) in te schatten. Daar geeft Diov een praktisch voorbeeld van.
Ik neem aan dat je gebruikt maakt van sessies? Dus dat je werkt met $_SESSION?
Zo ja, dan kun je toch de tijd opgeven hoe lang een sessie geldig is? Na die periode van inactiviteit werkt de sessie niet meer en zal een gebruiker opnieuw moeten inloggen.
Zo ja, dan kun je toch de tijd opgeven hoe lang een sessie geldig is? Na die periode van inactiviteit werkt de sessie niet meer en zal een gebruiker opnieuw moeten inloggen.
Ozzie: de werkelijke vraag was of ik kon weten wanneer een sessie is verlopen en die tijd opslaan, maar het antwoord is nee. Maar je kan het 'uitloggen' wel schatten door bij het veranderen van pagina dit door bvb last_active op te slaan.
Hoe registreer ik best een last_active bij het wisselen van een pagina?
Hoe registreer ik best een last_active bij het wisselen van een pagina?
Brecht S op 08/06/2014 10:47:59:
Hoe registreer ik best een last_active bij het wisselen van een pagina?
Hiervoor kun je $_SERVER['REQUEST_TIME'] gebruiken: dit is een Unix-timestamp met de starttijd van het HTTP-verzoek.
Brecht S op 08/06/2014 10:47:59:
Ozzie: de werkelijke vraag was of ik kon weten wanneer een sessie is verlopen en die tijd opslaan, maar het antwoord is nee. Maar je kan het 'uitloggen' wel schatten door bij het veranderen van pagina dit door bvb last_active op te slaan.
Je hoeft helemaal niets te schatten, want je kunt de sessieduur nauwkeurig zelf instellen. Stel dat je die instelt op exact 1 uur. Als het laatste HTTP-verzoek dan om 12:34:00 werd ontvangen, weet je dat de sessie is verlopen om 13:34:00. PHP vernietigt de sessie automatisch als dat uur is verstreken zonder activiteit.
Daarmee is het probleem uit je startpost opgelost: een gebruiker die op vrijdagmiddag het browservenster sloot, heeft op maandagochtend geen sessie meer, tenzij je zelf een sessieduur van meerdere dagen instelt.
Je weet pas dat de sessie verloopt na 1h als je dat instelt indien er geen activiteit meer is. Wat met een user die om 12:34:00 een pagina bezoekt en 10 minuten vanalles op die pag doet en dan niks meer? Dan is de tijd 12:34:00 + 00:10:00 + 01:00:00, niet? Dus eigenlijk kan je het nooit juist weten.
Is het dan zo dat ik iedere keer dat een pagina bezocht word ik last_active bvb in de db aanpas met $_SERVER['REQUEST_TIME']? En als de user naar een andere page gaat kan ik dat veld weer laten updaten met een nieuwe request_time. En hoe kan ik daar dan automatisch een uur bijtellen bij de laatste aanpassing van het veld last_active? Of zie ik dit verkeerd?
Is het dan zo dat ik iedere keer dat een pagina bezocht word ik last_active bvb in de db aanpas met $_SERVER['REQUEST_TIME']? En als de user naar een andere page gaat kan ik dat veld weer laten updaten met een nieuwe request_time. En hoe kan ik daar dan automatisch een uur bijtellen bij de laatste aanpassing van het veld last_active? Of zie ik dit verkeerd?
Code (php)
1
2
2
$seconden = ""; // hier het aantal seconden dat erbij moet
$time = $time + $seconden; // $time moet in de database
$time = $time + $seconden; // $time moet in de database
je kan het beter per 3 minuten doen
of nog preciseer 1 minuut.
dit sla je elke keer op in een table in de database
vervolgens update je elke keer de $time variable als de user iets doet op je website
en als je de last active nodig hebt dan doe je
lijkt mij?
Brecht S op 08/06/2014 18:59:59:
Je weet pas dat de sessie verloopt na 1h als je dat instelt indien er geen activiteit meer is. Wat met een user die om 12:34:00 een pagina bezoekt en 10 minuten vanalles op die pag doet en dan niks meer? Dan is de tijd 12:34:00 + 00:10:00 + 01:00:00, niet? Dus eigenlijk kan je het nooit juist weten.
Klopt.
Maar waarom is het zo belangrijk om het op de minuut (/seconde?) nauwkeurig te weten?
Brecht S op 08/06/2014 18:59:59:
Is het dan zo dat ik iedere keer dat een pagina bezocht word ik last_active bvb in de db aanpas met $_SERVER['REQUEST_TIME']? En als de user naar een andere page gaat kan ik dat veld weer laten updaten met een nieuwe request_time.
Klopt. Zou niet met 1 of 3 minuten werken; nadeel daarvan is als iemand even wat anders gaat doen (of het gaat bv. om lange teksten, veel invoer) dat dan de tijd verstreken is op het moment van de volgende activiteit. Gevolg: iemand wordt automatisch uitgelogd, terwijl diegene nog actief is.
Brecht S op 08/06/2014 18:59:59:
En hoe kan ik daar dan automatisch een uur bijtellen bij de laatste aanpassing van het veld last_active? Of zie ik dit verkeerd?
Update-query i.c.m. NOW() + INTERVAL 1 HOUR
Ok, we nemen een uur. Het gedeelte om het veld last_active iedere keer op te slaan in de database indien een pag bezocht is lijkt me eenvoudig. Het probleem is dat ik niet weet wanneer ik dat veld (last_active) moet updaten met die NOW() + INTERVAL 1 HOUR?
Gewijzigd op 09/06/2014 10:06:07 door Brecht S
>> Het probleem is dat ik niet weet wanneer ik dat veld (last_active) moet updaten met die NOW() + INTERVAL 1 HOUR?
Iedere keer als er een request wordt uitgevoerd. Simpel gezegd, telkens als iemand op jouw website een pagina bezoekt of een formulier verstuurt.
Iedere keer als er een request wordt uitgevoerd. Simpel gezegd, telkens als iemand op jouw website een pagina bezoekt of een formulier verstuurt.
>> Is het dan zo dat ik iedere keer dat een pagina bezocht word ik last_active bvb in de db aanpas met $_SERVER['REQUEST_TIME']? En als de user naar een andere page gaat kan ik dat veld weer laten updaten met een nieuwe request_time.
Dus als ik het goed begrijp moet ik ipv server request time de functie now() + interval 1h gebruiken en dus niet de server request time om last_active te updaten?
Dus als ik het goed begrijp moet ik ipv server request time de functie now() + interval 1h gebruiken en dus niet de server request time om last_active te updaten?
Volgens mij begrijp je het goed.
Overigens vind ik het niet kloppen om een veld met de naam last_active de waarde now() + interval 1 hour te geven. Dat suggereert namelijk dat je nu al weet dat de gebruiker over precies een uur iets gaat doen. Als je een dergelijk talent hebt moet je dat niet verspillen met programmeren. ;-)
Een veld met de naam last_active zou ik dus de waarde now() geven. Vervolgens kijk je in je scripting of dat tijdstip meer dan een uur geleden was. Zo ja, dan is de gebruiker dus niet actief meer.
Alternatief zou je het veld expire_at kunnen noemen. Dan is een waarde als now() + interval 1 hour wél logisch.
Een veld met de naam last_active zou ik dus de waarde now() geven. Vervolgens kijk je in je scripting of dat tijdstip meer dan een uur geleden was. Zo ja, dan is de gebruiker dus niet actief meer.
Alternatief zou je het veld expire_at kunnen noemen. Dan is een waarde als now() + interval 1 hour wél logisch.
@ Willem vp: daar kan ik rekening mee houden.
Ik zou wel de waarde NOW() niet willen gebruiken maar eerder iets van DATE("j F Y, g:i a"). Kan ik daar ook de INTERVAL + 1 HOUR aan toevoegen?
Ik zou wel de waarde NOW() niet willen gebruiken maar eerder iets van DATE("j F Y, g:i a"). Kan ik daar ook de INTERVAL + 1 HOUR aan toevoegen?
INTERVAL is een functie van MySQL. Zolang je een datum gebruikt in een date/time-formaat waar MySQL mee overweg kan, kun je INTERVAL gebruiken.
Ik kan toch ook op deze manier werken? i.p.v. INTERVAL + 1 HOUR te gebruiken? OF zou dit niet werken?
Waarna ik dan de $time gebruik om de database te updaten.
Code (php)
1
2
3
4
2
3
4
$time = 'Tue May 15 10:14:30';
$time = strtotime($time) + 3600;
$time = date('D M j G:i:s', $time);
echo $time;
$time = strtotime($time) + 3600;
$time = date('D M j G:i:s', $time);
echo $time;
Waarna ik dan de $time gebruik om de database te updaten.
Gewijzigd op 09/06/2014 15:37:28 door Brecht S
Kan mij hier iemand mee verder helpen?
Waarom werken met een interval? Dan is de tijd toch niet meer relatief? Zelf update ik gewoon de last_active column met NOW() iedere keer als er een request word gedaan.
Waarom zou je een interval doen? Dit zou betekenen als ik net een request heb gedaan en een half uur niks doe dat ik dan nog steeds 'online' ben?
Waarom zou je een interval doen? Dit zou betekenen als ik net een request heb gedaan en een half uur niks doe dat ik dan nog steeds 'online' ben?
Code (php)
1
2
3
2
3
<?php
$query = 'UPDATE table_users SET last_active = "NOW()" WHERE id = "'.$user->get('id')."';
?>
$query = 'UPDATE table_users SET last_active = "NOW()" WHERE id = "'.$user->get('id')."';
?>
Gewijzigd op 11/06/2014 12:54:37 door Joakim Broden
INderdaad werken met een interval lijkt me niet de beste oplossing. Lijkt me beter om een interval te gebruiken wanneer je de gegevens uit de database haalt. Bijv. elk uur een cronjob die iedereen uitlogt die een uur inactief is geweest.




