$_SESSION & Tijd vergelijken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mr.Ark

Mr.Ark

09/01/2010 13:39:00
Quote Anchor link
Beste mensen,

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
 
PHP hulp

PHP hulp

22/12/2024 11:54:00
 
Milo

Milo

09/01/2010 14:18:00
Quote Anchor link
Waarom maak je dat niet gewoon met een mysql tabel:
- 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...
 
Mr.Ark

Mr.Ark

09/01/2010 14:22:00
Quote Anchor link
@ Milo

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.
 
Milo

Milo

09/01/2010 14:34:00
Quote Anchor link
Ja oke...

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 ;)
 
Joren de Wit

Joren de Wit

09/01/2010 14:49:00
Quote Anchor link
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...
 
John D

John D

09/01/2010 14:57:00
Quote Anchor link
$_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
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
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>

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.
Gewijzigd op 01/01/1970 01:00:00 door John D
 
- Mark -

- Mark -

09/01/2010 15:02:00
Quote Anchor link
$_SESSION variant, Ik ga ervan uit dat je session_start() al ergens hebt staan.

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
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.
        
            // ...

            
        }    

?>
Gewijzigd op 01/01/1970 01:00:00 door - Mark -
 
Joren de Wit

Joren de Wit

09/01/2010 16:36:00
Quote Anchor link
@John: mooie methode, niet bij stil gestaan dat je er op die manier ook achter kunt komen.

@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 :)
 
Mr.Ark

Mr.Ark

09/01/2010 18:31:00
Quote Anchor link
Heren, bedankt voor jullie reacties, ik ga er morgen weer verder mee, vanavond even een rust avond ^-^
 
John D

John D

09/01/2010 18:39:00
Quote Anchor link
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....
Gewijzigd op 01/01/1970 01:00:00 door John D
 
Citroen Anoniem Graag

Citroen Anoniem Graag

09/01/2010 20:28:00
Quote Anchor link
@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?
Gewijzigd op 01/01/1970 01:00:00 door Citroen Anoniem Graag
 
John D

John D

09/01/2010 20:49:00
Quote Anchor link
- fileatime() geeft dat geen problemen op een FAT schijf ?
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.
 



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.