Saltar al contenido principal

Gestión del estado

HTTP es un protocolo stateless, sin estado. Por ello, se simula el estado mediante el uso de cookies, tokens o la sesión. El estado es necesario para procesos tales como el carrito de la compra, operaciones asociadas a un usuario, etc... El mecanismo de PHP para gestionar la sesión emplea cookies de forma interna. Las cookies se almacenan en el navegador, y la sesión en el servidor web.

Cookies

Las cookies se almacenan en el array global $_COOKIE. Lo que coloquemos dentro del array, se guardará en el cliente. Hay que tener presente que el cliente puede no querer almacenarlas.

Existe una limitació de 20 cookies por dominio y 300 en total en el navegador.

En PHP, para crear una cookie se utiliza la función setcookie:

<?php
setcookie(nombre [, valor [, expira [, ruta [, dominio [, seguro [, httponly ]]]]]]);
setcookie(nombre [, valor = "" [, opciones = [] ]] )
?>

Destacar que el nombre no puede contener espacios ni el caracter ;. Respecto al contenido de la cookie, no puede superar los 4 KB.

Por ejemplo, mediante cookies podemos comprobar la cantidad de visitas diferentes que realiza un usuario:

<?php
$accesosPagina = 0;
if (isset($_COOKIE['accesos'])) {
$accesosPagina = $_COOKIE['accesos']; // recuperamos una cookie
setcookie('accesos', ++$accesosPagina); // le asignamos un valor
}
?>
Inspeccionando las cookies

Si queremos ver que contienen las cookies que tenemos almacenadas en el navegador, se puede comprobar su valor en Dev ToolsApplicationStorage.

El tiempo de vida de las cookies puede ser tan largo como el sitio web en el que residen. Ellas seguirán ahí, incluso si el navegador está cerrado o abierto.

Para borrar una cookie se puede poner que expiren en el pasado:

<?php
setcookie(nombre, "", 1) // pasado

O que caduquen dentro de un periodo de tiempo deteminado:

<?php
setcookie(nombre, valor, time() + 3600) // Caducan dentro de una hora

Se utilizan para:

  • Recordar los inicios de sesión
  • Almacenar valores temporales de usuario
  • Si un usuario está navegando por una lista paginada de artículos, ordenados de cierta manera, podemos almacenar el ajuste de la clasificación.

La alternativa en el cliente para almacenar información en el navegador es el objeto LocalStorage.

Sesión

La sesión añade la gestión del estado a HTTP, almacenando en este caso la información en el servidor. Cada visitante tiene un ID de sesión único, el cual por defecto se almacena en una cookie denominada PHPSESSID. Si el cliente no tiene las cookies activas, el ID se propaga en cada URL dentro del mismo dominio. Cada sesión tiene asociado un almacén de datos mediante el array global $_SESSION, en el cual podemos almacenar y recuperar información.

La sesión comienza al ejecutar un script PHP. Se genera un nuevo ID y se cargan los datos del almacén:

Las operaciones que podemos realizar con la sesión son:

<?php
session_start(); // carga la sesión
session_id() // devuelve el id
$_SESSION[clave] = valor; // inserción
session_destroy(); // destruye la sesión
unset($_SESSION[clave]; // borrado

Vamos a ver mediante un ejemplo como podemos insertar en un página datos en la sesión para posteriormente en otra página acceder a esos datos. Por ejemplo, en sesion1.php tendríamos

<?php
session_start(); // inicializamos
$_SESSION["ies"] = "IES Severo Ochoa"; // asignación
$instituto = $_SESSION["ies"]; // recuperación
echo "Estamos en el $instituto ";
?>
<br />
<a href="sesion2.php">Y luego</a>

Y posteriormente podemos acceder a la sesión en sesion2.php:

<?php
session_start();
$instituto = $_SESSION["ies"]; // recuperación
echo "Otra vez, en el $instituto ";
?>
Configurando la sesión en php.ini

Las siguiente propiedades de php.ini permiten configurar algunos aspectos de la sesión:

  • session.save_handler: controlador que gestiona cómo se almacena (files)
  • session.save_path: ruta donde se almacenan los archivos con los datos (si tenemos un cluster, podríamos usar /mnt/sessions en todos los servidor de manera que apuntan a una carpeta compartida)
  • session.name: nombre de la sesión (PHSESSID)
  • session.auto_start: Se puede hacer que se autocargue con cada script. Por defecto está deshabilitado
  • session.cookie_lifetime: tiempo de vida por defecto

Más información en la documentación oficial.