Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Contare gli utenti online con PHP

Uno script in PHP per contare il numero di utenti che sta visitando una pagina Web. Uso delle sessioni e del database
Uno script in PHP per contare il numero di utenti che sta visitando una pagina Web. Uso delle sessioni e del database
Link copiato negli appunti

Esistono diverse procedure per creare un script PHP con cui contare il numero di utenti on line su una determinata pagina Web o su un sito

Nel corso di questa trattazione verrà proposto un esempio basato sull'utilizzo combinato di MySQL per l'archiviazione dei dati e delle sessioni per la memorizzazione degli accessi in modo univoco.

La struttura del database

La realizzazione di un un'applicazione destinata al conteggio e alla visualizzazione del numero di utenti on line richiederà:

  • un database, chiamato per esempio statistiche;
  • un file, chiamato ad esempio config.php, contenente le funzioni e i parametri di connessione al DBMS e di selezione del database
  • un file con il codice per il conteggio degli utenti, per la stampa a video dei risultati e per la cancellazione dei record obsoleti (chiamato ad esempio utenti_on_line.php).

In pratica il database verrà utilizzato per memorizzare le informazioni relative agli utenti, il file di configurazione permetterà all'applicazione di interagire con MySQL e il file dello script si occuperà di restituire in output i dati riguardanti gli utenti online in uno specifico intervallo di tempo; una volta superato questo intervallo le informazioni relative ad una sessione verranno cancellate in quanto obsolete.

All'interno del database statistiche sarà presente una sola tabella, chiamata ad esempio utenti_on_line, essa dovrà contenere 3 campi:

  • un campo id, univoco e auto-incrementale che fungerà da chiave primaria per la tabella;
  • un campo sessione destinato a contenere l'identificatore numerico prodotto dalla funzione session_id() e associato ad ogni singola sessione generata dall'ingresso di un nuovo utente sulla pagina.
  • un ultimo campo chiamato timestamp in cui verrà registrato il momento esatto della connessione di un utente (il timestamp è una stringa che rappresenta il numero di secondi a partire dalle ore 00:00:00 del 1 gennaio 1970 UTC).

Di seguito verrà proposto l'SQL necessario per la creazione della tabella e dei relativi campi:

CREATE TABLE `utenti_on_line` (
  `id` int(11) NOT NULL auto_increment,
  `sessione` varchar(50) NOT NULL,
  `timestamp` int(11) default '0',
  PRIMARY KEY  (`id`)
);

In realtà il campo id non è fondamentale per il funzionamento dell'applicazione, è stato comunque introdotto per correttezza formale e perché potrebbe tornare utile nel caso in cui si desideri contare il numero di record memorizzati dallo script nel corso del suo funzionamento. Il tipo di dato TIMESTAMP è supportato nativamente da MySQL, in alternativa è quindi possibile lasciare che sia il DBMS a registrarlo impostando come valore predefinito il CURRENT_TIMESTAMP.

I file dell'applicazione

Un volta creato e strutturato il database, il prossimo passaggio sarà quello di creare un semplice file di configurazione con i parametri necessari per la connessione al DBMS e per la selezione del database; per far questo sarà possibile definire una classe, come quella descritta nell'esempio seguente, che potrà essere salvata in un file config.php per l'inclusione:

<?php
class MySQL
{
 function MySQL()
 {
 # hostname di MySQL
  $this->host = "localhost"; 
 # nome utente per la connessione
  $this->user = "username"; 
 # password dell'utente
  $this->pass = "password";
 # nome del database
  $this->data = "statistiche"; 
 # connessione al DBMS
  $this->link = mysql_connect($this->host, $this->user, $this->pass);
 # selezione del database
  mysql_select_db($this->data);
 }
}
# istanza della classe
$data = new MySQL();
?>

Fatto questo si potrà passare alla fase che concerne la creazione del cuore dell'applicazione: il file che fungerà da contatore, da visualizzatore e da gestore degli utenti.

<?php
# inizializzazione della sessione
@session_start();
# creazione dell'identificatore di sessione
$sessione=@session_id();
# memorizzazione in variabile del momento di connessione
$time=@time();
# definizione dell'intervallo di tempo valido per l'utente connesso
$intervallo=$time-300;

# inclusione del file di configurazione  
@require "config.php";

# confronto tra identificatore di sessione e dati in tabella
$sql_confronto="SELECT * FROM utenti_on_line WHERE sessione='$sessione'";
$res_confronto=@mysql_query($sql_confronto) or die(mysql_error());

# se l'identificatore non è presente viene creato un nuovo record
if(@mysql_num_rows($res_confronto)==0){
                $sql_inserimento="INSERT INTO utenti_on_line(sessione, timestamp)VALUES('$sessione', '$time')";
                $res_inserimento=@mysql_query($sql_inserimento) or die(mysql_error());
        }
else {
        # se l'identificatore è già presente viene aggiornato il 
                # valore relativo al momento di connessione
         $sql_aggiornamento="UPDATE utenti_on_line SET timestamp='$time' WHERE sessione = '$sessione'";
        $res_aggiornamento=@mysql_query($sql_aggiornamento) or die(mysql_error());
        }

# estrazione dei record presenti in tabella per il conteggio 
$sql_conteggio="SELECT id FROM utenti_on_line";
$res_conteggio=@mysql_query($sql_conteggio) or die(mysql_error());
$conteggio=@mysql_num_rows($res_conteggio);

# stampa a video del conteggio
echo "Utenti online: " . $conteggio; 
 
# cancellazione dei record obsoleti 
$sql_cancellazione="DELETE FROM utenti_on_line WHERE timestamp<$intervallo";
$res_cancellazione=@mysql_query($sql_cancellazione) or die(mysql_error());

# chiusura della connessione 
@mysql_close();
?>

In pratica l'applicazione registra un identificatore per ogni sessione inizializzata dall'accesso di un utente, se questo identificatore non è presente nella tabella viene aggiunto, se esso è invece già presente viene aggiornato il dato relativo al momento del suo accesso; nel caso in cui il momento di accesso di un utente sia inferiore al timestamp ottenuto sottraendo 5 minuti (300 secondi) dal risultato della funzione time(), il record corrispondente verrà eliminato considerando l'utente non più online.


Ti consigliamo anche