Pages

Saturday, August 14, 2010

Online users με την php

Ένα πολύ καλό feature που υπάρχει στα περισσότερα fora είναι που έχουν τη δυνατότητα να εμφανίζουν το πόσοι/ποιοι είναι online εκείνη την ώρα, ή για την ακρίβεια τα τελευταία Χ λεπτά.

Μετά από μια αποτυχημένη προσπάθεια ρώτησα σε ένα forum για το πώς μπορεί να γίνει κάτι τέτοιο και μου δείξανε τον σωστό δρόμο.

Η γενική ιδέα είναι η εξής:

Όταν έρχεται κάποιος στο site αποθηκεύουμε κάποιο μοναδικό χαρακτηριστικό του (στην περίπτωσή μας την IP του) είτε σε ένα αρχείο είτε στη βάση μας, μαζί με ένα timestamp για το πότε έγινε η συγκεκριμένη καταχώρηση.

Κάθε φορά μετά που ελέγχουμε το αρχείο, κοιτάμε ποια timestamps έχουν λήξει, σβήνουμε τις αντίστοιχες εγγραφές και ξαναποθηκεύουμε το αρχείο.

Με κώδικα θα είναι πιο κατανοητό το όλο θέμα:


<?php
 function checkUsers()
 {
  $timeout = 1500; //se deuterolepta
  $found = false;

  $users = file("users.txt");
  foreach($users as $user)
  {
   $line = explode(" ", trim($user));
   if(time() - $line[1] < $timeout) // an o xristis se auti ti grammi _DEN_ exei liksei
   {
    if($_SERVER['REMOTE_ADDR'] == $line[0]) // an o xristis pou irthe twra yparxei
    {
     $found = true;
     $line[1] = time(); //apla ananewnoume ton xrono tou
    }
    $newList[] = $line; //kai kanoume mia lista me tous energous xristes
   }
  }
  if(!$found) //an _DEN_ vrethike o xristis pou irthe twra sto arxeio
  {
   //tote dimiourgoume nea eggrafi kai ti vazoume sto telos tis listas me tous energous xristes
   $line[0] = $_SERVER['REMOTE_ADDR'];
   $line[1] = time();
   $newList[] = $line;
  }

  //twra i newList periexei osous einai akoma online, opote kanoume tin eggrafi
  $pf = fopen("users.txt", "w");
  if(is_array($newList) && count($newList) > 0)
  {
   foreach($newList as $line)
   {
    fwrite($pf, implode(" ", $line) . "\n");
   }
  }
  fclose($pf);
  //kai telos epistrefoume ton arithmo twn xristwn pou einai online
  return count($newList); 
 }

?>


Μπορεί κάλλιστα να επεκταθεί ώστε να κάνει διαχωρισμό και μεταξύ των εγγεγραμμένων ή μη χρηστών, και διάφορα άλλα πράγματα.

No comments:

Post a Comment