Saltar a contenido

Gestión del estado

HTTP es un protocolo stateless, sin estado. Para simular el estado se emplean cookies, tokens o sesiones, lo cual es necesario en procesos como el carrito de la compra o para manejar operaciones específicas de cada usuario. En PHP, el mecanismo para gestionar la sesión utiliza internamente cookies. Las cookies se almacenan en el navegador, mientras que la información de la sesión reside en el servidor web.

Cookies

Las cookies se almacenan en el array global $_COOKIE. Todo dato añadido a este array será guardado en el cliente, aunque hay que recordar que el usuario puede optar por no aceptar cookies.

Existen restricciones: un máximo de 20 cookies por dominio y hasta 300 cookies en total en el navegador.

En PHP, se crea una cookie usando la función setcookie:

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

Es importante que el nombre de la cookie no contenga espacios ni el carácter ;. Además, el contenido de la cookie no debe exceder los 4 KB.

Por ejemplo, las cookies se pueden usar para contar el número de visitas distintas realizadas por un usuario:

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

Inspeccionando las cookies

Para ver el contenido de las cookies almacenadas en el navegador, se puede consultar en Dev Tools --> Application --> Storage

Las cookies pueden tener un tiempo de vida prolongado, persistiendo incluso cuando el navegador se cierra. Para eliminar una cookie, basta con asignarle una fecha de expiración en el pasado:

ejemplocookie.php
<?php
setcookie(nombre, "", 1) // expira en el pasado

O asignarles una duración específica:

<?php
setcookie(nombre, valor, time() + 3600) // expira en una hora

Comunicación con cookies

Comunicación con *cookies*

Las cookies se emplean para:

  • Recordar los inicios de sesión
  • Almacenar valores temporales de usuario
  • Guardar configuraciones, como las preferencias de clasificación en listas de artículos.

Otra opción en el cliente para almacenar información en el navegador es el objeto LocalStorage.

Sesión

La sesión agrega persistencia a HTTP, almacenando la información en el servidor. Cada visitante tiene un ID de sesión único, que por defecto se guarda en una cookie llamada PHPSESSID. Si el cliente no acepta cookies, el ID de sesión se transmite en cada URL del mismo dominio. Los datos de la sesión se guardan en el array global $_SESSION, en el cual se puede almacenar y recuperar información.

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

Comunicación con sesión

Comunicación con sesión

Las principales operaciones de sesión en PHP son:

<?php
session_start(); // inicia o carga la sesión
session_id(); // obtiene el id
$_SESSION[clave] = valor; // inserción
session_destroy(); // destruye la sesión
unset($_SESSION[clave]); // elimina una clave

Veamos un ejemplo de cómo insertar datos en una sesión en una página y luego acceder a esos datos en otra página. Por ejemplo, en sesion1.php:

sesion1.php
<?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>

Luego, en sesion2.php, podemos acceder a la sesión:

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

Configurando la sesión en php.ini

Las siguientes 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.

Actividades

  • 📝 AC 410. (RA4 / CE4b CE4c CE4f / IC1 / 3p) - Mediante el uso de cookies, informa al usuario de si es su primera visita, o si no lo es, muestre su valor (valor de un contador).

    Además, se debe permitir que el usuario reinicialice su contador de visitas.

  • ⚓ AR 411. (RA4 / CE4b CE4c CE4f / IC1 / 3p) - Mediante el uso de cookies, crea una página con un desplegable con varios colores, de manera que el usuario pueda cambiar el color de fondo de la página (atributo bgcolor).

    Al cerrar la página, ésta debe recordar, al menos durante 24h, el color elegido y la próxima vez que se cargue la pagina, lo haga con el último color seleccionado.

  • 📝 AC 412 . (RA4 / CE4b CE4c CE4f / IC1 / 3p) - Modifica el ejercicio AC410 para almacenar el color de fondo en la sesión y no emplear cookies. Además, debe contener un enlace a un archivo que muestre el color y dar la posibilidad de:

    • volver a la página anterior mediante un enlace
    • mediante otro enlace, vaciar la sesión y volver a la página anterior.
  • 🧪 PR 413. (RA4 / CE4a CE4b CE4c CE4f / IC2 / 5p) - Haciendo uso de la sesión, vamos a dividir el formulario del ejercicio AC402 en subformularios:

    • El primero envía los datos (nombre y apellidos, email, url y sexo) a un segundo formulario.
    • El segundo formulario lee los datos y los mete en la sesión. A continuación, muestra el resto de campos del formulario a rellenar (convivientes, aficiones y menú). Envía estos datos a un tercer formulario.
    • El tercer formulario recoge los datos enviados en el paso anterior y junto a los que ya estaban en la sesión, se muestran todos los datos en una tabla/lista desordenada.