In- en uitlogtijd van een sessie bijhouden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Ward van der Put
Moderator

Ward van der Put

11/06/2014 13:20:43
Quote Anchor link
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.
 
PHP hulp

PHP hulp

14/05/2024 23:32:52
 
Brecht S

Brecht S

11/06/2014 14:20:28
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$time = NOW();
$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?
 
Gerhard l

gerhard l

11/06/2014 14:29:48
Quote Anchor link
Brecht S op 11/06/2014 14:20:28:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$time = NOW();
$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 ;))
 
Brecht S

Brecht S

11/06/2014 14:57:09
Quote Anchor link
Nee inderdaad foutje van mij.
Het moet zijn:

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


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
 
Ward van der Put
Moderator

Ward van der Put

11/06/2014 15:03:44
Quote Anchor link
Als je de tijd wilt opslaan in de database:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$time
= date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME'] + 3600);
?>
 
Brecht S

Brecht S

11/06/2014 16:19:03
Quote Anchor link
Ok. Even snel overlopen dan.
Ik gebruik volgende code om bvb het veld last_active aan te passen in de database bij ieder bezoek aan een pagina.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$time
= date('Y-m-d H:i:s');

// MySQL koppeling, enz...

?>


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
 
Ward van der Put
Moderator

Ward van der Put

11/06/2014 16:27:34
Quote Anchor link
Je hebt dan een last_active die soms juist is maar er ook vaak 1 uur naast zit. Waarom wil je dat?

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.
 
Brecht S

Brecht S

11/06/2014 16:38:46
Quote Anchor link
Het probleem is dat een user die de vrijdagavond zijn browser laat openstaan en pas de maandagmorgen terugkomt geen 'logout' heeft gehad. Nu sluit de sessie af bij inactiviteit gedurende een uur en met de last_active + 1h weet ik ongeveer de tijd dat hij gestopt is met werken. Nu is dit niet helemaal juist omdat ik niet weet hoelang die user op de laatst bezochte pagina actief is geweest. Even een voorbeeld:

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
 
Ward van der Put
Moderator

Ward van der Put

11/06/2014 16:42:54
Quote Anchor link
Je kunt om 18:00 gewoon 18:00 als last_active opslaan. Is het dan ná 19:00 nog steeds 18:00, dan kan de sessie worden gesloten. Dáárvoor hoef je dus niet alvast 1 uur bij 18:00 op te tellen.

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
 
Brecht S

Brecht S

11/06/2014 16:48:03
Quote Anchor link
Zo had ik het nog niet bekeken. Dus dat 1h bijtellen heeft inderdaad geen zin.
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?
 
Ward van der Put
Moderator

Ward van der Put

12/06/2014 07:13:53
Quote Anchor link
Het kan, zoals gezegd, allemaal in PHP zelf. Hier komt er geen database aan te pas, behalve dan voor het inloggen uiteraard:

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

?>


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
 
Brecht S

Brecht S

12/06/2014 08:43:01
Quote Anchor link
We zullen dat straks eens testen. In elk geval tot nu toe al heel hartelijk bedankt iedereen voor de hulp.
Ik laat na het testen weten of alles goed is gelukt.
 

Pagina: « vorige 1 2



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.