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 funzionesession_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 (iltimestamp
è 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.