In- en uitlogtijd van een sessie bijhouden
Als je gewoon het sessiebeheer van PHP zelf gebruikt, dan worden inactieve sessies vanzelf gesloten en om de zoveel hits opgeruimd door een garbage collector.
Code (php)
1
2
3
4
2
3
4
$time = NOW();
$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;
Ik zou op deze manier werken om het veld last_active te updaten.
Indien een user gedurende de laatste request niks meer heeft gedaan zal ik er ook voor zorgen dat de sessie na een uur niet meer actief is. Dan is de tijd wel correct.
In het geval een user op de logout button drukt is de sessie uiteraard ook niet meer actief en kan ik de tijd in last_active updaten met gewoon de functie NOW() zonder de + 3600
Lijkt dit een goede oplossing?
Brecht S op 11/06/2014 14:20:28:
Ik zou op deze manier werken om het veld last_active te updaten.
Indien een user gedurende de laatste request niks meer heeft gedaan zal ik er ook voor zorgen dat de sessie na een uur niet meer actief is. Dan is de tijd wel correct.
Code (php)
1
2
3
4
2
3
4
$time = NOW();
$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;
Ik zou op deze manier werken om het veld last_active te updaten.
Indien een user gedurende de laatste request niks meer heeft gedaan zal ik er ook voor zorgen dat de sessie na een uur niet meer actief is. Dan is de tijd wel correct.
Snap niet hoe je dit bedoelt. Now() is geen PHP functie. Je kan toch altijd de last active updaten met Now(), dan klopt je tijd altijd. (als je tijdinstellingen goed staan ;))
Het moet zijn:
Code (php)
1
2
3
4
2
3
4
$time = date('D M j G:i:s');
$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;
Dan gebruik ik de functie NOW() in mysql niet. Dit is een alternatieve manier denk ik, niet?
Gewijzigd op 11/06/2014 14:58:16 door Brecht S
Ik gebruik volgende code om bvb het veld last_active aan te passen in de database bij ieder bezoek aan een pagina.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$time = date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME'] + 3600);
// MySQL koppeling, enz...
?>
$time = date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME'] + 3600);
// MySQL koppeling, enz...
?>
Indien op de logout knop gedrukt is door een bepaalde user gebruik ik bvb volgende code:
Hier spelen de 3600s extra geen rol meer want de tijd kan juist bepaald worden.
Klopt mijn denkwijze hier?
Gewijzigd op 11/06/2014 16:21:21 door Brecht S
Volens mij kun je beter altijd bij elke pageview de huidige tijd opslaan: dat biedt je geen absolute zekerheid, maar wel de hoogst haalbare zekerheid.
Vrijdagavond 18:00 bezoekt de user zijn laatste pagina en vertrekt die daarna naar huis en laat zijn browser open staan. Na 1h verloopt zijn sessie automatisch, dus om 19:00. Dus het veld last_active is dan vb 11-06-2014 19:00
Maandagmorgen komt de user terug en moet opnieuw inloggen en de last_active word terug geupdated.
Dus wat ik doe bij iedere pageview is het veld last_active updaten met de time functie + 3600.
Het enige wat ik hier niet juist kan weten is: als de user om 18:00 zijn laatste pag heeft bezocht en nog 10 minuten op die pagina is gebleven want dan zou de last_active vb 11-06-2014 19:10 moeten worden.
Of is daar ook een oplossing voor?
Gewijzigd op 11/06/2014 16:40:37 door Brecht S
Ga je er soms wel en soms niet 1 uur bij optellen, dan wordt je waarde last_active dubbelzinnig: er zijn dan twee versies met twee verschillende betekenissen in omloop.
Gewijzigd op 11/06/2014 16:43:11 door Ward van der Put
Het veld last_active moet inderdaad worden geupdated bij iedere pageview met de juiste tijd.
Daarna verloopt de sessie gewoon na een uur maar dat speelt dan geen rol of dit nu 10 min of een uur of 5h is... Er is toch niemand meer aan het werk dan.
Nu is nog juist de code belangrijk om een sessie te laten verlopen na een bepaalde tijd. Dat moet ik nog eens opzoeken want heb hier geen idee voor. Ik heb wel ergens gelezen dat een cookie veiliger zou zijn om te laten verlopen dan een sessie? Of kunnen we het hier houden bij sessies enkel?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
// HTTP-only sessiecookie gebruiken (geen sessie-ID's in URL's)
ini_set('session.cookie_httponly', '1');
// Sessie-ID's versleutelen met SHA-1 in plaats van MD5
ini_set('session.hash_function', '1');
// Sessieduur instellen op 60 minuten = 3600 seconden
ini_set('session.gc_maxlifetime', 3600);
session_cache_expire(60);
// Sessie starten of hervatten
session_start();
// Laatste activiteit meer dan 1 uur (3600 seconden) geleden?
if (isset($_SESSION['last_active']) && (time() - $_SESSION['last_active'] > 3600)) {
// Sessie legen en vernietigen
session_unset();
session_destroy();
// @todo Daarna hier eventueel naar inloggen.
} else {
$_SESSION['last_active'] = time();
}
?>
// HTTP-only sessiecookie gebruiken (geen sessie-ID's in URL's)
ini_set('session.cookie_httponly', '1');
// Sessie-ID's versleutelen met SHA-1 in plaats van MD5
ini_set('session.hash_function', '1');
// Sessieduur instellen op 60 minuten = 3600 seconden
ini_set('session.gc_maxlifetime', 3600);
session_cache_expire(60);
// Sessie starten of hervatten
session_start();
// Laatste activiteit meer dan 1 uur (3600 seconden) geleden?
if (isset($_SESSION['last_active']) && (time() - $_SESSION['last_active'] > 3600)) {
// Sessie legen en vernietigen
session_unset();
session_destroy();
// @todo Daarna hier eventueel naar inloggen.
} else {
$_SESSION['last_active'] = time();
}
?>
Houd er verder rekening mee dat het instellen van de sessieduur met session.gc_maxlifetime en session_cache_expire() alleen niet voldoende is: je moet, zoals je al van plan was, zelf nog een controle op een last_active toevoegen.
Gewijzigd op 12/06/2014 07:14:14 door Ward van der Put
Ik laat na het testen weten of alles goed is gelukt.