Una sessió PHP
Les sessions de PHP són un mecanisme per emmagatzemar informació de l'usuari a través de múltiples pàgines web. A diferència de les cookies, que s'emmagatzemen al navegador de l'usuari, les dades de la sessió es guarden al servidor. La clau per vincular les dades de la sessió al navegador de l'usuari és un identificador de sessió únic que s'envia entre el client i el servidor.
Com funcionen les sessions
- Inici de la sessió: Quan una pàgina web crida la funció
session_start(), PHP genera un identificador de sessió (un string de caràcters aleatoris) per a l'usuari si encara no en té cap. Aquest identificador és l'enllaç entre el navegador i el fitxer de sessió al servidor. - Enviament de l'identificador: L'identificador de sessió s'envia al navegador de l'usuari, generalment a través d'una cookie anomenada
PHPSESSID. - Emmagatzematge de dades: Les dades es guarden en un array global anomenat
$_SESSION. Qualsevol dada que es vulgui conservar entre pàgines s'emmagatzema en aquest array associatiu (per exemple,$_SESSION['nom'] = 'Joan'). - Recuperació de dades: En cada pàgina posterior, si s'utilitza de nou
session_start(), PHP llegeix l'identificador de sessió de la cookie, troba el fitxer de sessió corresponent al servidor i carrega les dades a l'array$_SESSION, fent-les accessibles al script.
Pàgina 1 (sessio1.php)
<?php
// Inicia la sessió
session_start();
// Emmagatzema dades a la sessió
$_SESSION['nom'] = 'Anna';
$_SESSION['id_usuari'] = 123;
echo "Dades de la sessió guardades. <a href='sessio2.php'>Anar a la pàgina 2</a>";
Pàgina 2 (sessio2.php)
<?php
// Cal iniciar la sessió per accedir a les dades
session_start();
// Recupera les dades de la sessió
if (isset($_SESSION['nom'])) {
echo "Hola, " . $_SESSION['nom'] . "!<br>";
echo "El teu ID d'usuari és: " . $_SESSION['id_usuari'];
} else {
echo "No hi ha dades de sessió disponibles.";
}
El principal avantatge d'utilitzar variables de sessió, és que aquestes s'emmagatzemen en el servidor i no en el client, això redueix el risc de manipulació per part de l'usuari, encara que no tenim límit en la mida perque s'emmagatzemen en disc, cal tenir en compte que quan s'executa el script aquestes variables es troben en memòria per cada usuari que es troba en execució.
Vida util de les sessions?
La vida útil de les variables de sessió al servidor comença amb la funció session_start() i acaba quan la sessió es destrueix o caduca.
-
Creació: La sessió s'inicia amb
session_start(). En aquest moment, es crea un fitxer de sessió temporal al servidor per a l'usuari, i un identificador únic de sessió s'associa amb ell. -
Activitat: Mentre l'usuari navega pel lloc web, l'identificador de sessió es manté actiu, i les variables guardades a
$_SESSIONpersisteixen en les peticions successives. -
Finalització: La sessió pot finalitzar de dues maneres:
-
Caducitat per temps (Time-out): Si l'usuari no realitza cap petició al servidor durant un temps determinat, la sessió expira automàticament. Aquest temps es defineix en el fitxer de configuració de PHP (
php.ini) amb la directivasession.gc_maxlifetime. El valor per defecte sol ser de 1440 segons (24 minuts). El recollidor d'escombraries de la sessió (session garbage collector) és l'encarregat d'eliminar periòdicament aquests fitxers de sessió caducats. -
Destrucció explícita: Un script PHP pot tancar la sessió manualment amb la funció
session_destroy(). Aquesta acció esborra el fitxer de sessió del servidor, eliminant totes les dades que hi havia guardades. Això s'utilitza habitualment quan un usuari tanca la sessió (log out).
-
Factors que afecten la vida útil
-
session.gc_maxlifetime: Aquesta directiva dephp.inidetermina el temps màxim d'inactivitat d'una sessió abans que es consideri obsoleta. -
session.cookie_lifetime: Aquest paràmetre de configuració afecta la vida de la cookie de sessió al navegador de l'usuari. Si la cookie caduca, el navegador ja no enviarà l'identificador de sessió al servidor, trencant la connexió amb les dades de la sessió. -
Destrucció manual: L'ús de funcions com
session_unset()per alliberar totes les variables de la sessió osession_destroy()per eliminar-la completament finalitza la seva vida útil de manera controlada.
Eliminar una variable de sessió
unset(): La forma més comuna és usar la funció unset() per treure una clau específica de l'array $_SESSION.
<?php
session_start();
// Guarda una variable
$_SESSION['nom_usuari'] = 'Joan';
// Elimina només una variable
unset($_SESSION['nom_usuari']);
// La variable 'nom_usuari' ha estat eliminada
print_r($_SESSION);
Eliminar sessió del server
session_unset(): Aquesta funció elimina totes les variables registrades en l'array $_SESSION. És una opció útil per netejar totes les dades de la sessió alhora, però no tanca la sessió en si mateixa.
<?php
session_start();
// Guarda algunes variables
$_SESSION['nom'] = 'Anna';
$_SESSION['carret'] = ['pommes', 'peres'];
// Elimina totes les variables de la sessió
session_unset();
// L'array $_SESSION ara està buit
print_r($_SESSION);
Eliminar sessió sencera
Si es vol tancar la sessió completament, cal fer dos passos:
-
Eliminar les variables de l'array
$_SESSION. -
Destruir la sessió al servidor i la cookie al navegador.
Aquest procés és típic d'un tancament de sessió d'usuari (logout).
<?php
session_start();
// Pas 1: Destrueix totes les variables de la sessió
session_unset();
// Pas 2: Destrueix la sessió al servidor
session_destroy();
// Opcional: Elimina la cookie de sessió del navegador
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
echo "Sessió tancada correctament.";
-
session_unset(): Deixa l'array$_SESSIONbuit. Tot i quesession_destroy()farà el mateix, és una bona pràctica netejar l'array primer. -
session_destroy(): Aquesta és la funció clau. S'encarrega d'eliminar el fitxer de sessió del servidor, fent que les dades de la sessió siguin irrecuperables. -
setcookie(): La líniasetcookie()ens garanteix que la cookie de la sessió s'elimini del navegador de l'usuari. Això impedeix que el navegador enviï un ID de sessió antic en peticions futures