In- en uitlogtijd van een sessie bijhouden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Brecht S

Brecht S

07/06/2014 16:43:44
Quote Anchor link
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?
 
PHP hulp

PHP hulp

25/04/2024 22:34:03
 
 - Diov  -

- Diov -

07/06/2014 18:21:04
Quote Anchor link
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 !
Gewijzigd op 07/06/2014 18:22:22 door - Diov -
 
Brecht S

Brecht S

07/06/2014 19:07:49
Quote Anchor link
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?
 
Obelix Idefix

Obelix Idefix

07/06/2014 20:13:37
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

07/06/2014 22:29:44
Quote Anchor link
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.
 
Brecht S

Brecht S

08/06/2014 10:47:59
Quote Anchor link
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?
 
Ward van der Put
Moderator

Ward van der Put

08/06/2014 11:14:41
Quote Anchor link
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.
 
Brecht S

Brecht S

08/06/2014 18:59:59
Quote Anchor link
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?
 
Christian k

christian k

08/06/2014 20:43:12
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$seconden = ""; // hier het aantal seconden dat erbij moet
$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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$time    = time();
$select  = "SELECT * FROM table_name WHERE last_active < $time";


lijkt mij?
 
Obelix Idefix

Obelix Idefix

08/06/2014 22:57:23
Quote Anchor link
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
 
Brecht S

Brecht S

09/06/2014 10:03:30
Quote Anchor link
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
 
Ozzie PHP

Ozzie PHP

09/06/2014 10:44:13
Quote Anchor link
>> 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.
 
Brecht S

Brecht S

09/06/2014 14:00:26
Quote Anchor link
>> 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?
 
Ozzie PHP

Ozzie PHP

09/06/2014 14:37:48
Quote Anchor link
Volgens mij begrijp je het goed.
 
Willem vp

Willem vp

09/06/2014 14:56:46
Quote Anchor link
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.
 
Brecht S

Brecht S

09/06/2014 15:13:44
Quote Anchor link
@ 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?
 
Willem vp

Willem vp

09/06/2014 15:30:18
Quote Anchor link
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.
 
Brecht S

Brecht S

09/06/2014 15:36:27
Quote Anchor link
Ik kan toch ook op deze manier werken? i.p.v. INTERVAL + 1 HOUR te gebruiken? OF zou dit niet werken?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;

Waarna ik dan de $time gebruik om de database te updaten.
Gewijzigd op 09/06/2014 15:37:28 door Brecht S
 
Brecht S

Brecht S

11/06/2014 12:22:51
Quote Anchor link
Kan mij hier iemand mee verder helpen?
 
Joakim Broden

Joakim Broden

11/06/2014 12:52:50
Quote Anchor link
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?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    $query
= 'UPDATE table_users SET last_active = "NOW()" WHERE id = "'.$user->get('id')."';
?>
Gewijzigd op 11/06/2014 12:54:37 door Joakim Broden
 
Gerhard l

gerhard l

11/06/2014 13:13:32
Quote Anchor link
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.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.