Mira la lección en vídeo
Accede al vídeo completo de esta lección y a más contenido exclusivo con el Plan Plus.
Desbloquear Plan PlusPor qué son necesarias las sesiones (estado en aplicaciones web)
En el contexto del desarrollo de aplicaciones web, uno de los desafíos más importantes es la gestión del estado entre las distintas peticiones que realiza un usuario. El protocolo HTTP es por naturaleza sin estado (stateless), lo que significa que cada solicitud que un cliente realiza al servidor es independiente y no tiene relación con las anteriores ni con las siguientes. Esto implica que, sin mecanismos adicionales, el servidor no puede recordar información sobre usuarios o acciones previas, afectando la continuidad y personalización de la experiencia del usuario.
Las sesiones son la solución a este problema, ya que permiten mantener información persistente a lo largo de múltiples interacciones entre el cliente y el servidor. A través de las sesiones, es posible asociar datos específicos a un usuario durante un periodo de tiempo, lo que es esencial para funcionalidades como autenticación, carritos de compra, preferencias de usuario y otras características que requieren recordar el estado previo del usuario.
Por ejemplo, en un sitio web de comercio electrónico, es fundamental que el sistema pueda recordar los productos que un usuario ha agregado a su carrito de compras mientras navega por diferentes páginas. Sin el uso de sesiones, el servidor no tendría forma de identificar al usuario ni de mantener el estado de su carrito, lo que resultaría en una experiencia de usuario deficiente.
Sin el uso de sesiones, intentar almacenar información entre solicitudes es inútil. Considere el siguiente ejemplo en PHP:
<?php
$count = 0;
$count++;
echo "El contador es: $count\n";
Cada vez que se accede a este script, el valor de $count se inicializa en cero y luego se incrementa en uno, mostrando siempre El contador es: 1
. Esto ocurre porque la variable $count no persiste entre solicitudes, ya que cada petición es independiente y no mantiene el estado previo.
Las sesiones funcionan asignando un identificador único de sesión (generalmente almacenado en una cookie en el lado del cliente) que se envía al servidor con cada solicitud. Este identificador permite al servidor acceder a los datos almacenados en la sesión del usuario y mantener la continuidad del estado a través de las interacciones.
Por lo tanto, las sesiones son esenciales en las aplicaciones web para superar la naturaleza sin estado del protocolo HTTP y proporcionar una experiencia de usuario coherente y personalizada. Sin ellas, sería extremadamente difícil implementar funcionalidades comunes y esenciales en aplicaciones web modernas.
Inicio y cierre de sesiones (session_start()
, session_destroy()
)
Guarda tu progreso
Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.
Más de 25.000 desarrolladores ya confían en CertiDevs
Para gestionar sesiones en PHP, es esencial iniciar la sesión en cada script que requiera acceso o modificación a los datos de la sesión. Esto se logra utilizando la función session_start()
, la cual debe ser llamada al comienzo del script, antes de enviar cualquier salida al navegador.
La función session_start()
verifica si ya existe una sesión activa para el usuario actual. Si existe, reanuda la sesión; si no, crea una nueva sesión y genera un identificador de sesión único. Este identificador, que suele almacenarse en una cookie en el navegador del usuario, permite al servidor mantener el seguimiento de la sesión en solicitudes posteriores.
Es crucial recordar que session_start()
debe invocarse antes de enviar cualquier contenido, incluyendo espacios en blanco o caracteres de nueva línea. Si se envía salida al navegador antes de iniciar la sesión, se producirán errores relacionados con las cabeceras HTTP, ya que PHP no podrá modificar las cabeceras necesarias para gestionar la sesión.
Ejemplo de inicio de sesión en PHP:
<?php
session_start();
// Código adicional
En este ejemplo, se inicia la sesión con session_start()
y luego se puede proceder con el resto del código que requiere acceso a la sesión.
Para finalizar una sesión y eliminar todos los datos asociados, se utiliza la función session_destroy()
. Esta función destruye la información de la sesión almacenada en el servidor, pero no elimina las variables de sesión existentes en el script ni la cookie de sesión en el navegador del usuario.
Para garantizar la completa eliminación de la sesión, es recomendable seguir estos pasos adicionales:
- Vaciar el array
$_SESSION
para eliminar todas las variables de sesión. - Eliminar la cookie de sesión en el navegador del usuario.
- Llamar a
session_destroy()
para destruir la sesión en el servidor.
Ejemplo de cierre de sesión seguro:
<?php
session_start();
// Vaciar el array $_SESSION
$_SESSION = [];
// Eliminar la cookie de sesión si existe
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(
session_name(),
'',
time() - 42000,
$params["path"],
$params["domain"],
$params["secure"],
$params["httponly"]
);
}
// Destruir la sesión
session_destroy();
En este código, se inicia la sesión con session_start()
, luego se vacía $_SESSION
, se elimina la cookie de sesión estableciendo su tiempo de expiración en el pasado y finalmente se llama a session_destroy()
.
La eliminación de la cookie es importante porque, de lo contrario, el identificador de sesión podría seguir siendo enviado al servidor en solicitudes posteriores, lo que podría representar un riesgo de seguridad. Al borrar la cookie, nos aseguramos de que el navegador del usuario no envíe más el identificador de sesión antiguo.
Es una buena práctica implementar este procedimiento de cierre de sesión en aplicaciones que manejan información sensible, ya que ayuda a prevenir el secuestro de sesión y otros ataques relacionados con la gestión inadecuada de sesiones.
Al trabajar con sesiones en PHP, es fundamental controlar adecuadamente su inicio y finalización. Siempre se debe llamar a session_start()
al comienzo de los scripts que interactúan con la sesión y utilizar session_destroy()
junto con la limpieza de variables y cookies cuando se requiera finalizar la sesión de manera segura.
Almacenamiento y recuperación de datos en $_SESSION
Una vez iniciada la sesión con session_start()
, se puede utilizar la variable superglobal $_SESSION
para almacenar y recuperar información que persiste durante la sesión del usuario. $_SESSION
es un array asociativo que permite guardar datos accesibles en todas las páginas que compartan la misma sesión.
Almacenamiento de datos en $_SESSION
Para guardar información en la sesión, se asignan valores al array $_SESSION
utilizando claves personalizadas. Por ejemplo:
<?php
session_start();
$_SESSION['usuario'] = 'María';
$_SESSION['email'] = 'maria@example.com';
$_SESSION['ultima_visita'] = time();
echo "Datos de sesión almacenados.\n";
En este ejemplo, se almacenan tres datos en la sesión: el nombre de la usuario, su email y la marca de tiempo de su última visita. Estos valores estarán disponibles en otras páginas que inicien la sesión con session_start()
.
Recuperación de datos de $_SESSION
Para acceder a los datos almacenados en la sesión, se utiliza el array $_SESSION
con las claves correspondientes:
<?php
session_start();
if (isset($_SESSION['usuario'])) {
echo "Bienvenida, " . $_SESSION['usuario'] . ".\n";
echo "Tu email es: " . $_SESSION['email'] . ".\n";
echo "Última visita: " . date('d/m/Y H:i:s', $_SESSION['ultima_visita']) . ".\n";
} else {
echo "No hay datos de sesión disponibles.\n";
}
En este código, se verifica si existen datos en la sesión antes de acceder a ellos. Es fundamental utilizar isset()
para comprobar la existencia de una clave en $_SESSION
, evitando errores si la clave no está definida.
Actualización y eliminación de datos
Los valores en $_SESSION
pueden ser actualizados asignando nuevos valores a las claves existentes. Para eliminar un dato de la sesión, se utiliza la función unset()
:
unset($_SESSION['email']);
Después de esto, la clave 'email'
ya no estará disponible en la sesión.
Ejemplo práctico: contador de visitas
Un uso común de las sesiones es llevar un contador de visitas personalizado para cada usuario:
<?php
session_start();
if (isset($_SESSION['contador'])) {
$_SESSION['contador']++;
} else {
$_SESSION['contador'] = 1;
}
echo "Esta es tu visita número " . $_SESSION['contador'] . ".\n";
Aquí, se incrementa el valor de $_SESSION['contador']
cada vez que el usuario carga la página, manteniendo un seguimiento durante su sesión.
Almacenamiento de datos complejos
Es posible almacenar en $_SESSION
cualquier tipo de dato que sea serializable, como arrays o incluso objetos. Por ejemplo, para guardar un carrito de compra:
<?php
session_start();
$_SESSION['carrito'][] = 'Producto A';
$_SESSION['carrito'][] = 'Producto B';
echo "Productos agregados al carrito.\n";
En este caso, se añade una lista de productos al array $_SESSION['carrito']
.
Consideraciones de seguridad
Es importante ser consciente de la seguridad al utilizar sesiones. Nunca se deben almacenar en $_SESSION
datos sensibles sin las medidas de protección adecuadas. Además, es recomendable limitar la cantidad de información almacenada para evitar afectar el rendimiento del servidor.
También es esencial validar y sanitizar cualquier dato que se extraiga de la sesión antes de utilizarlo, especialmente al mostrarlo en la interfaz del usuario, para prevenir vulnerabilidades como XSS.
Aprendizajes de esta lección de PHP
- Entender el problema del protocolo HTTP sin estado.
- Aprender a crear sesiones en PHP con
session_start()
. - Gestionar el almacenamiento de datos en
$_SESSION
. - Destruir sesiones de forma segura usando
session_destroy()
. - Implementar ejemplos prácticos como un contador de visitas.
- Garantizar la seguridad al manipular datos de sesión.
Completa este curso de PHP y certifícate
Únete a nuestra plataforma de cursos de programación y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.
Asistente IA
Resuelve dudas al instante
Ejercicios
Practica con proyectos reales
Certificados
Valida tus conocimientos
Más de 25.000 desarrolladores ya se han certificado con CertiDevs