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.
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 ;)
Met enkel sessies gaat dit je niet lukken. De informatie uit de ene sessie is niet in de andere sessie uit te lezen, dat zou nog eens een mooi beveiligingslek zijn!
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...
$_SESSION variant ZONDER MySQL (niet nodig) !!
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
<?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>
[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.
$_SESSION variant, Ik ga ervan uit dat je session_start() al ergens hebt staan.
<?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.
// ...
}
?>
PS: de regel $_SESSION["viewer"] = $_SERVER["REMOTE_ADDR"]; is slechts om "iets" te schrijven in het session-file. Doe je dat niet dan werkt de timing niet....
@John: Mooie methode, ik ga ook overwegen zoiets te implementeren!
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?