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()
{
$this->host = "localhost";
$this->user = "username";
$this->pass = "password";
$this->data = "statistiche";
$this->link = mysql_connect($this->host, $this->user, $this->pass);
mysql_select_db($this->data);
}
}
$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
@session_start();
$sessione=@session_id();
$time=@time();
$intervallo=$time-300;
@require "config.php";
$sql_confronto="SELECT * FROM utenti_on_line WHERE sessione='$sessione'";
$res_confronto=@mysql_query($sql_confronto) or die(mysql_error());
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 {
$sql_aggiornamento="UPDATE utenti_on_line SET timestamp='$time' WHERE sessione = '$sessione'";
$res_aggiornamento=@mysql_query($sql_aggiornamento) or die(mysql_error());
}
$sql_conteggio="SELECT id FROM utenti_on_line";
$res_conteggio=@mysql_query($sql_conteggio) or die(mysql_error());
$conteggio=@mysql_num_rows($res_conteggio);
echo "Utenti online: " . $conteggio;
$sql_cancellazione="DELETE FROM utenti_on_line WHERE timestamp<$intervallo";
$res_cancellazione=@mysql_query($sql_cancellazione) or die(mysql_error());
@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.