Lezione Precedente Elenco Lezioni Lezione Successiva

Laboratorio di Sistemi Informativi

Sessioni

Finora abbiamo visto due modi con cui è possibile passare dei parametri da una pagina PHP ad un'altra: le FORM (con i due metodi GET e POST) e il passaggio diretto di parametri nella URL. Se vogliamo trovare una analogia con i linguaggi di programmazione, questi due metodi corrispondono entrambi al passaggio di parametri per le funzioni: viene invocata una pagina web ben precisa e a quella pagina web si passano dei valori. Talvola sarebbe comodo avere delle variabili che preservano il loro valore in tutte le pagine web, senza preoccuparsi di doverle passare esplicitamente come parametri. La natura del protocollo HTTP, che è fondamentalmente senza memoria, non si adatta molto bene a queste necessità. Tuttavia, PHP riesce lo stesso a implementare queste variabili locali che, in gergo, si chiamano variabili di sessione.

Sessioni con PHP

Le variabili che vengono utilizzate in uno script PHP hanno validità ristretta ad una singola esecuzione della pagina. Una volta terminato lo script, tutte le variabili utilizzate vengono dimenticate. A questa regola, tuttavia, fa eccezione una variabile, l'array associativo $_SESSION. Tutte le modifiche apportate alla variabile $_SESSION sono valide non solo per una determinata esecuzione di uno script, ma per tutti le esecuzioni di tutti gli script che fanno parte di una stessa sessione.

In PHP con il termine sessione si indica un insieme di variabili (tutte facenti parte dell'array associativo $_SESSION) che preservano il loro valore da una pagina ad un altra. In un certo momento ci possono essere più sessioni attive contemporaneamente, ad esempio quando lo stesso sito è consultato da più utenti.

Il PHP mette a disposizione i seguenti comandi di base per la manipolazione delle sessioni:

Per poter accedere alle variabili di sessione, uno script PHP deve innanzitutto recuperare la sessione corrente con session_start. Ad esempio supponiamo di avere il seguente script:

<?php
session_start();
?>
<HTML>
<HEAD>
<TITLE> Prova sessione </TITLE>
</HEAD>
<?php
if (isset($_SESSION["count"])) {
  echo "Hai visitato questa pagina $_SESSION[count] volte";
  $_SESSION["count"]++;
} else {
  echo "Sei un nuovo utente";
  $_SESSION["count"]=1;
}
?>
</BODY>
</HTML>

Ogni volta che ci colleghiamo alla pagina web generata da questo script, ci verrà restituito un numero progressivo diverso. Questo perché lo script riconosce il primo accesso da parte di un utente come l'inizio di una sessione di lavoro e mantiene traccia del numero di volte che la pagina è stata acceduta, durante la sessione, nella variabile $_SESSION["count"]. Notare che non si tratta di un indice globale: persone diverse che si collegano alla stessa macchina avranno risultati diversi!!!

Ma come fa il sistema a riconoscere un accesso da parte di un utente da un accesso da parte di un altro utente. Tutto si basa sui cookie del browser. I cookie sono delle informazioni che il server web può depositare nel computer client dell'utente per accedervi poi in un momento successivo. Ogni cookie ha vari attributi, tra cui un nome e una informazione correlata. Con la funzione session_start() il PHP controlla se esiste nel client un cookie con nome PHPSESSID e se sì carica l'informazione correlata. Questa è un codice numerico esadecimale del tipo d198667a6cb5ff11f761934c59534398 che viene usato internamente da PHP per distinguere una sessione dall'altra. Ad ogni sessione è associato un array associativo $_SESSION diverso. Se il cookie di nome PHPSESSID non esiste, verrà generato un identificativo casuale e memorizzato nel client col nome PHPSESSID. Quando l'utente si collegherà la volta successiva alla stessa pagina, il PHP riconoscerà l'utente per il valore contenuto nel cookie, e imposterà in maniera appropriata l'array $_SESSION.


ATTENZIONE!: il comando session_start funziona in maniera analoga al comando header, manipolando le intestazioni del protocollo HTTP. Pertanto, bisogna ricordarsi che va usato prima che qualunque output sia stato emesso. Dopo, è troppo tardi.

Terminare le sessioni

Una sessione non è eterna. Ci sono vari modi per "sganciarci" dalla sessione in corso. Uno di questi è far sì che il browser non passi più il cookie PHPSESSID al server web. Ecco alcune possibilità:

In alternativa, è possibile distruggere la sessione, ovvero cancellare le informazioni che il PHP memorizza sul server web. Questo è possibile:

In ognuno di questi casi, quando viene chiamata la funzione session_start(), il sistema non è in grado di recuperare un vecchia sessione e ne crea una nuova. Si provi, ad esempio, dopo aver richiamato un paio di volte lo script contatore mostrato sopra, a chiamare la seguente brevissima pagina PHP:

<?php 
  session_start();
  session_destroy(); 
?> 

Il contatore dovrebbe ripartire da 0. Notare anche che per distruggere una sessione occorre prima aprirla.

Tanto per curiosità, diciamo che il PHP memorizza le informazioni sulle sessioni in dei file dal nome sess_<idsess> nella directory /var/lib/php/session. Distruggere una sessione vuol dire essenzialmente cancellare uno di questi file. Notare che la directory dove vengono salvate le sessioni può variare da una distribuzione all'altra di Linux.

Lezione Precedente Elenco Lezioni Lezione Successiva

Valid HTML 4.01 Transitional Valid CSS!