$_SESSION & Tijd vergelijken
Dit zal vast en zeker een hele makkelijke manier zijn alleen kom ik er even niet uit.
Ben bezig met een simpel status van hoeveel gasten & gebruikers online zijn.
Nu wil ik de performance zo laag mogelijk houden.
Omdat te realiseren dacht ik, ik laat om de 5 minuten checken of er weer een actie van de gebruiker is geweest. Dit doe ik dan met een $_SESSION die wordt aangemaakt als een gebruiker op de pagina komt.
Als de $_SESSION ouder dan 5 minuten is dat hij dan gaat inserten / updaten.
Het gaat dus puur om het vergelijken van een $_SESSION en de daadwerkelijke tijd van nu.
Iemand die mij op weg kan helpen?
Groetjes,
Mr.Ark
- statics
--- id int
--- user_id int
--- datum datetime
En dan zet je in bijv je config een script dat die tabel update per keer dat je online iets doet...
Ik werk ook met een database.
Alleen zit ik er niet op te wachten dat elke seconde een update of een insert plaats vindt. (Figuurlijk dan)
Als ik dus een SESSIE aanmaak met de tijd van laatste activiteit en die dan vergelijk met die van de nieuwe tijd, dus de daadwerkelijke tijd, en dan pas update of insert dan zal dat me heel wat performance schelen snap je?
Insert wordt alleen gedaan als het ip nog niet in de database staat. Update wordt dus gedaan als het ip voorkomt in de database.
Zo houd ik ook me database aardig klein, want elk ip nummer is uniek en komt dus maar 1 x voor in de DB.
Ik ben bang dat ik je da nu niet verder kan helpen, ik weet wat je bedoelt maar niet hoe ik het zou moeten uitvoeren.
Als ik het tegenkom zal ik het je melden ;)
De methode die jij voorstelt zal wel werken, mits je een timestamp in de sessie opslaat. Dan zul je met PHP moeten controleren of die timestamp ouder is dan 5 minuten, en zo ja de database moeten updaten. Hiermee voorkom je echter niet dat je systeem altijd 5 minuten achterloopt. Een controle vanuit de database zou kunnen aantonen dat een gebruiker niet actief was in de laatste 5 minuten terwijl dat toch degelijk het geval was maar toen de sessievariabele ter controle gebruikt is...
Met sessies is het prima op te lossen en supersimpel. Kost vrijwel geen performance. Gedoe met MySQL bijhouden in een tabel is overdone. Je weet toch niet helemaal zeker wanneer een gebruiker weer weg is. Met deze simpele code heb je een vrij goeie weergave. Ik gebruik het op www.cafeproost.nl
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
/* Start the session */
session_save_path('phpsessions');
session_start();
$_SESSION["viewer"] = $_SERVER["REMOTE_ADDR"];
/* Define how long the maximum amount of time the session can be inactive. */
define("MAX_IDLE_TIME", 2);
function getOnlineUsers(){
/* Default directory: /var/lib/php/session */
if ( $directory_handle = opendir( session_save_path() ) )
{
$count = 0;
while ( false !== ( $file = readdir( $directory_handle ) ) )
{
if($file != "." && $file != "..")
{
if(time()- fileatime(session_save_path() . "/" . $file) < MAX_IDLE_TIME * 60)
{
$count++;
}
else //remove files with PHP - Unlink()
{
unlink(session_save_path() . "/" . $file);
}
}
}
closedir($directory_handle);
return $count;
}
else
{
return false;
}
}
// echo "Website bezoekers online: " . getOnlineUsers() . "<br />";
?>
<html>
<head>
<style type="text/css">
<!-- BODY {background:none transparent;}-->
</style>
</head>
<body>
<font face="trebuchet ms" size="2" color="black">
<b>
Website bezoekers online: <?echo getOnlineUsers(); ?>
</b>
</font>
</body>
</html>
/* Start the session */
session_save_path('phpsessions');
session_start();
$_SESSION["viewer"] = $_SERVER["REMOTE_ADDR"];
/* Define how long the maximum amount of time the session can be inactive. */
define("MAX_IDLE_TIME", 2);
function getOnlineUsers(){
/* Default directory: /var/lib/php/session */
if ( $directory_handle = opendir( session_save_path() ) )
{
$count = 0;
while ( false !== ( $file = readdir( $directory_handle ) ) )
{
if($file != "." && $file != "..")
{
if(time()- fileatime(session_save_path() . "/" . $file) < MAX_IDLE_TIME * 60)
{
$count++;
}
else //remove files with PHP - Unlink()
{
unlink(session_save_path() . "/" . $file);
}
}
}
closedir($directory_handle);
return $count;
}
else
{
return false;
}
}
// echo "Website bezoekers online: " . getOnlineUsers() . "<br />";
?>
<html>
<head>
<style type="text/css">
<!-- BODY {background:none transparent;}-->
</style>
</head>
<body>
<font face="trebuchet ms" size="2" color="black">
<b>
Website bezoekers online: <?echo getOnlineUsers(); ?>
</b>
</font>
</body>
</html>
Edit:
Ik roep het aan in een iframe maar een andere manier van integreren is natuurlijk ook prima. Voor deze code moet je een directory phpsessions aanmaken onder je document-root en de apache deamon moet er kunnen schrijven. Het schrijven van de session file kan ook op default plaats gelaten worden session_save_path('phpsessions'); kan dan weggelaten. Dit is afhankelijk van je provider.
Ik roep het aan in een iframe maar een andere manier van integreren is natuurlijk ook prima. Voor deze code moet je een directory phpsessions aanmaken onder je document-root en de apache deamon moet er kunnen schrijven. Het schrijven van de session file kan ook op default plaats gelaten worden session_save_path('phpsessions'); kan dan weggelaten. Dit is afhankelijk van je provider.
Gewijzigd op 01/01/1970 01:00:00 door John D
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
#| Settings | De vertraging voor de volgende update in seconden.
$tijd_vertraging = 300;
#| Controleren of " $_SESSION['tijd'] " is geset.
if(isset($_SESSION['tijd']))
{
#| Controleren of het al tijd is voor de volgende update.
if(time() >= $_SESSION['tijd'])
{
#| Update " $_SESSION['tijd'] " met de tijd voor de volgende update.
$_SESSION['tijd'] = time() + $tijd_vertraging;
#| MySQL gedeelte.
// ...
}
}
else
{
/*---- INFO: " $_SESSION['tijd'] " is nog niet geset. ----*/
#| Set " $_SESSION['tijd'] " met de huidige tijd plus de vertraging.
$_SESSION['tijd'] = time() + $tijd_vertraging;
#| MySQL gedeelte.
// ...
}
?>
#| Settings | De vertraging voor de volgende update in seconden.
$tijd_vertraging = 300;
#| Controleren of " $_SESSION['tijd'] " is geset.
if(isset($_SESSION['tijd']))
{
#| Controleren of het al tijd is voor de volgende update.
if(time() >= $_SESSION['tijd'])
{
#| Update " $_SESSION['tijd'] " met de tijd voor de volgende update.
$_SESSION['tijd'] = time() + $tijd_vertraging;
#| MySQL gedeelte.
// ...
}
}
else
{
/*---- INFO: " $_SESSION['tijd'] " is nog niet geset. ----*/
#| Set " $_SESSION['tijd'] " met de huidige tijd plus de vertraging.
$_SESSION['tijd'] = time() + $tijd_vertraging;
#| MySQL gedeelte.
// ...
}
?>
Gewijzigd op 01/01/1970 01:00:00 door - Mark -
@Mark: dat geeft je alleen informatie over de huidige gebruiker, niet over alle gebruikers die online zijn. En dat is nu juist wat de TS vraagt :)
Heren, bedankt voor jullie reacties, ik ga er morgen weer verder mee, vanavond even een rust avond ^-^
Gewijzigd op 01/01/1970 01:00:00 door John D
Alleen 3 opmerkingen/vragen:
-fileatime() geeft dat geen problemen op een FAT schijf?
-de resultaten van fileatime worden gecached, wil je meer realtime resultaten dan moet je de cache legen. Ik vraag me af of dit geen overkill wordt.
-heeft een shared hosting mogelijkheid om je session.save.path te wijzigen?
Gewijzigd op 01/01/1970 01:00:00 door Citroen Anoniem Graag
Geen idee, ik werk alleen op Linux (32 bits) file-systems.
-de resultaten van fileatime worden gecached ?
Ik heb geen last daarvan gehad, deze code werkt naar wens, probeer tegelijkertijd met verschillende browsers of peecees: www.cafeproost.nl
- ik heb de ervaring dat je juist bij shared hosting je session_save_path naar je eigen document-root moet zetten.