Sesiones
Las sesiones en PHP constituyen un mecanismo fundamental para mantener información específica del usuario durante su navegación por una aplicación web. A diferencia de las variables tradicionales que se pierden al finalizar la ejecución del script, las sesiones permiten conservar datos entre múltiples peticiones HTTP del mismo usuario.
Concepto y funcionamiento
Una sesión representa una conversación temporal entre el servidor y un cliente específico. Cuando un usuario accede por primera vez a una aplicación PHP que utiliza sesiones, el servidor genera un identificador único llamado session ID y lo envía al navegador, típicamente mediante una cookie especial.
El navegador almacena este identificador y lo envía automáticamente en cada petición posterior al mismo dominio. El servidor utiliza este ID para recuperar los datos almacenados previamente para ese usuario específico.
<?php
// Iniciar una nueva sesión o continuar la existente
session_start();
// El ID de sesión se genera automáticamente
echo "ID de sesión: " . session_id();
?>
Inicialización de sesiones
La función session_start()
debe llamarse antes de enviar cualquier salida al navegador, incluyendo espacios en blanco o etiquetas HTML. Esta función verifica si existe una sesión activa para el usuario y, en caso contrario, crea una nueva.
<?php
// CORRECTO: session_start() al inicio del archivo
session_start();
// Verificar si la sesión se inició correctamente
if (session_status() === PHP_SESSION_ACTIVE) {
echo "Sesión iniciada correctamente";
}
?>
Práctica recomendada: Incluir session_start()
en un archivo de configuración que se cargue en todas las páginas que requieran sesiones.
<?php
// config.php
session_start();
// Configuración adicional de la aplicación
define('APP_NAME', 'Mi Aplicación');
?>
Almacenamiento y recuperación de datos
La superglobal **$_SESSION**
funciona como un array asociativo donde podemos almacenar cualquier tipo de dato que PHP pueda serializar. Los datos se mantienen disponibles hasta que la sesión expire o sea destruida explícitamente.
<?php
session_start();
// Almacenar información del usuario
$_SESSION['usuario_id'] = 1234;
$_SESSION['nombre'] = 'Ana García';
$_SESSION['email'] = 'ana@ejemplo.com';
$_SESSION['rol'] = 'administrador';
// Almacenar arrays y objetos
$_SESSION['configuraciones'] = [
'tema' => 'oscuro',
'idioma' => 'es',
'notificaciones' => true
];
?>
Para recuperar los datos almacenados en páginas posteriores:
<?php
session_start();
// Verificar si existen datos en la sesión
if (isset($_SESSION['nombre'])) {
echo "Bienvenido, " . $_SESSION['nombre'];
} else {
echo "Por favor, inicia sesión";
}
// Mostrar configuraciones del usuario
if (isset($_SESSION['configuraciones'])) {
$config = $_SESSION['configuraciones'];
echo "Tema: " . $config['tema'];
echo "Idioma: " . $config['idioma'];
}
?>
Verificación y validación de sesiones
Es fundamental validar la existencia de datos de sesión antes de utilizarlos para evitar errores y garantizar la seguridad de la aplicación.
<?php
session_start();
// Función auxiliar para verificar autenticación
function usuarioAutenticado() {
return isset($_SESSION['usuario_id']) && !empty($_SESSION['usuario_id']);
}
// Verificar múltiples condiciones
function validarSesion() {
if (!usuarioAutenticado()) {
return false;
}
// Verificar tiempo de actividad (opcional)
if (isset($_SESSION['ultimo_acceso'])) {
$tiempoInactivo = time() - $_SESSION['ultimo_acceso'];
if ($tiempoInactivo > 1800) { // 30 minutos
return false;
}
}
return true;
}
// Uso práctico
if (validarSesion()) {
$_SESSION['ultimo_acceso'] = time();
echo "Acceso autorizado";
} else {
header('Location: login.php');
exit;
}
?>
Modificación y eliminación de datos
Los datos de sesión pueden modificarse en cualquier momento durante la ejecución del script, y los cambios se reflejan inmediatamente.
<?php
session_start();
// Modificar datos existentes
$_SESSION['nombre'] = 'Ana García Rodríguez';
$_SESSION['configuraciones']['tema'] = 'claro';
// Agregar nuevos elementos
$_SESSION['carrito'] = [];
$_SESSION['carrito'][] = ['producto' => 'Laptop', 'precio' => 899.99];
$_SESSION['carrito'][] = ['producto' => 'Mouse', 'precio' => 25.50];
// Eliminar elementos específicos
unset($_SESSION['configuraciones']['notificaciones']);
// Contar elementos en el carrito
$totalProductos = count($_SESSION['carrito']);
echo "Productos en carrito: " . $totalProductos;
?>
Destrucción de sesiones
Para finalizar una sesión completamente, es necesario realizar varios pasos que garanticen la eliminación completa de los datos tanto del servidor como del cliente.
<?php
session_start();
// Función completa para cerrar sesión
function cerrarSesion() {
// Eliminar todas las variables de sesión
$_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 en el servidor
session_destroy();
}
// Implementación en página de logout
if (isset($_POST['cerrar_sesion'])) {
cerrarSesion();
header('Location: index.php');
exit;
}
?>
Configuración y seguridad básica
PHP ofrece diversas opciones de configuración para sesiones que mejoran la seguridad y el rendimiento de la aplicación.
<?php
// Configuración antes de session_start()
ini_set('session.cookie_httponly', 1); // Previene acceso via JavaScript
ini_set('session.use_only_cookies', 1); // Solo usar cookies para session ID
ini_set('session.cookie_secure', 1); // Solo HTTPS (en producción)
// Configurar tiempo de vida de la sesión
ini_set('session.gc_maxlifetime', 3600); // 1 hora
// Regenerar ID de sesión periódicamente
session_start();
// Regenerar ID cada 5 minutos para mayor seguridad
if (!isset($_SESSION['creada'])) {
$_SESSION['creada'] = time();
} else if (time() - $_SESSION['creada'] > 300) {
session_regenerate_id(true);
$_SESSION['creada'] = time();
}
?>
Cookies
Las cookies en PHP representan un mecanismo de almacenamiento que permite guardar pequeñas cantidades de información directamente en el navegador del usuario. A diferencia de las sesiones que almacenan datos en el servidor, las cookies se almacenan físicamente en el dispositivo del cliente y se envían automáticamente con cada petición HTTP al dominio que las creó.
Concepto y características fundamentales
Una cookie es un archivo de texto pequeño que contiene pares clave-valor junto con metadatos que controlan su comportamiento. Estas características hacen que las cookies sean ideales para almacenar preferencias del usuario, configuraciones básicas y datos que necesitan persistir entre sesiones.
Las cookies tienen limitaciones importantes: cada cookie puede almacenar máximo 4KB de datos, y los navegadores suelen limitar a 50 cookies por dominio. Además, son visibles para el usuario y pueden ser modificadas o eliminadas desde el navegador.
<?php
// Crear una cookie básica
setcookie('nombre_usuario', 'María', time() + 3600);
// La cookie estará disponible en la siguiente carga de página
// No en la misma petición donde se crea
?>
Creación y configuración de cookies
La función setcookie()
debe ejecutarse antes de cualquier salida HTML, similar a session_start()
. Esta función acepta múltiples parámetros que controlan el comportamiento de la cookie.
<?php
// Sintaxis completa de setcookie()
setcookie(
'preferencias_usuario', // nombre
json_encode(['tema' => 'oscuro']), // valor
time() + (86400 * 30), // expiración (30 días)
'/', // path (toda la web)
'', // domain (dominio actual)
false, // secure (solo HTTPS)
true // httponly (no accesible via JavaScript)
);
// Verificar que la cookie se estableció correctamente
if (headers_sent()) {
echo "Error: No se pueden establecer cookies después de enviar headers";
} else {
echo "Cookie establecida correctamente";
}
?>
Recuperación y manipulación de datos
Las cookies se acceden mediante la superglobal **$_COOKIE**
y están disponibles inmediatamente después de la primera petición en la que fueron creadas. Es importante validar siempre la existencia de las cookies antes de usarlas.
<?php
// Verificar y recuperar cookies
if (isset($_COOKIE['preferencias_usuario'])) {
$preferencias = json_decode($_COOKIE['preferencias_usuario'], true);
$tema = $preferencias['tema'] ?? 'claro';
echo "Tema seleccionado: " . $tema;
} else {
echo "No hay preferencias guardadas";
}
// Función auxiliar para leer cookies de forma segura
function obtenerCookie($nombre, $valorPorDefecto = null) {
return $_COOKIE[$nombre] ?? $valorPorDefecto;
}
// Uso de la función auxiliar
$idioma = obtenerCookie('idioma', 'es');
$mostrarTutorial = obtenerCookie('tutorial_completado', 'false') === 'true';
?>
Cookies para recordar preferencias
Un uso práctico de las cookies es almacenar configuraciones que el usuario prefiere mantener entre visitas, como temas visuales o configuraciones de la interfaz.
<?php
// Procesar formulario de configuraciones
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$tema = $_POST['tema'] ?? 'claro';
$idioma = $_POST['idioma'] ?? 'es';
$mostrarNotificaciones = isset($_POST['notificaciones']) ? 'true' : 'false';
// Establecer cookies con expiración de 1 año
$expiracion = time() + (365 * 24 * 60 * 60);
setcookie('tema_usuario', $tema, $expiracion, '/');
setcookie('idioma_usuario', $idioma, $expiracion, '/');
setcookie('notificaciones_activas', $mostrarNotificaciones, $expiracion, '/');
$mensaje = "Preferencias guardadas correctamente";
}
// Aplicar configuraciones guardadas
$temaActual = obtenerCookie('tema_usuario', 'claro');
$idiomaActual = obtenerCookie('idioma_usuario', 'es');
$notificacionesActivas = obtenerCookie('notificaciones_activas', 'false') === 'true';
?>
<!DOCTYPE html>
<html>
<head>
<title>Configuración</title>
<link rel="stylesheet" href="estilos-<?= $temaActual ?>.css">
</head>
<body>
<?php if (isset($mensaje)): ?>
<p style="color: green;"><?= $mensaje ?></p>
<?php endif; ?>
<form method="POST">
<label>
Tema:
<select name="tema">
<option value="claro" <?= $temaActual === 'claro' ? 'selected' : '' ?>>Claro</option>
<option value="oscuro" <?= $temaActual === 'oscuro' ? 'selected' : '' ?>>Oscuro</option>
</select>
</label>
<label>
Idioma:
<select name="idioma">
<option value="es" <?= $idiomaActual === 'es' ? 'selected' : '' ?>>Español</option>
<option value="en" <?= $idiomaActual === 'en' ? 'selected' : '' ?>>English</option>
</select>
</label>
<label>
<input type="checkbox" name="notificaciones" <?= $notificacionesActivas ? 'checked' : '' ?>>
Recibir notificaciones
</label>
<button type="submit">Guardar Configuración</button>
</form>
</body>
</html>
Implementación de "Recordar usuario"
Las cookies son fundamentales para implementar la funcionalidad "Recordarme" en formularios de login, permitiendo que el usuario no tenga que introducir sus credenciales en cada visita.
<?php
// Procesar login con opción "recordar"
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$usuario = $_POST['usuario'] ?? '';
$password = $_POST['password'] ?? '';
$recordar = isset($_POST['recordar']);
// Validar credenciales (ejemplo simplificado)
if ($usuario === 'admin' && $password === 'secreto123') {
// Iniciar sesión normal
session_start();
$_SESSION['usuario'] = $usuario;
// Si marcó "recordar", crear cookie
if ($recordar) {
$token = bin2hex(random_bytes(32)); // Token seguro
setcookie('token_recordar', $token, time() + (30 * 24 * 60 * 60), '/', '', false, true);
// En aplicación real, guardar token en base de datos asociado al usuario
// file_put_contents('tokens.txt', $usuario . ':' . $token . "\n", FILE_APPEND);
}
header('Location: dashboard.php');
exit;
}
}
// Verificar token de "recordar" al cargar la página
if (!isset($_SESSION['usuario']) && isset($_COOKIE['token_recordar'])) {
$token = $_COOKIE['token_recordar'];
// En aplicación real, verificar token en base de datos
// Por ahora, ejemplo simplificado
if (strlen($token) === 64) { // Token válido
session_start();
$_SESSION['usuario'] = 'admin'; // Usuario asociado al token
header('Location: dashboard.php');
exit;
}
}
?>
Eliminación de cookies
Para eliminar una cookie, es necesario establecer una fecha de expiración en el pasado. PHP no puede eliminar directamente las cookies del navegador del usuario.
<?php
// Función para eliminar cookies
function eliminarCookie($nombre, $path = '/', $domain = '') {
setcookie($nombre, '', time() - 3600, $path, $domain);
// También eliminar del array $_COOKIE para la petición actual
if (isset($_COOKIE[$nombre])) {
unset($_COOKIE[$nombre]);
}
}
// Implementar "Cerrar sesión completa"
if (isset($_POST['cerrar_sesion_completa'])) {
// Destruir sesión
session_start();
session_destroy();
// Eliminar cookies relacionadas
eliminarCookie('token_recordar');
eliminarCookie('tema_usuario');
eliminarCookie('preferencias_usuario');
echo "Sesión cerrada y cookies eliminadas";
}
// Limpiar cookies específicas
if (isset($_POST['resetear_preferencias'])) {
eliminarCookie('tema_usuario');
eliminarCookie('idioma_usuario');
eliminarCookie('notificaciones_activas');
header('Location: configuracion.php');
exit;
}
?>
Configuración avanzada y seguridad
Las cookies modernas incluyen atributos de seguridad importantes que protegen la información del usuario y previenen ataques comunes.
<?php
// Configuración segura de cookies
function crearCookieSegura($nombre, $valor, $diasExpiracion = 30) {
$opciones = [
'expires' => time() + ($diasExpiracion * 24 * 60 * 60),
'path' => '/',
'domain' => '', // Dominio actual
'secure' => isset($_SERVER['HTTPS']), // Solo HTTPS si disponible
'httponly' => true, // No accesible via JavaScript
'samesite' => 'Strict' // Protección CSRF
];
return setcookie($nombre, $valor, $opciones);
}
// Usar la función segura
if (crearCookieSegura('configuracion_segura', json_encode(['version' => '1.0']))) {
echo "Cookie segura establecida";
} else {
echo "Error al establecer cookie";
}
?>
Diferencias prácticas entre cookies y sesiones
Comprender cuándo usar cookies versus sesiones es crucial para el desarrollo web efectivo:
<?php
session_start();
// SESIONES: Para datos sensibles y temporales
$_SESSION['usuario_id'] = 1234; // ID del usuario autenticado
$_SESSION['carrito'] = ['prod1', 'prod2']; // Carrito de compras
$_SESSION['ultimo_acceso'] = time(); // Control de actividad
// COOKIES: Para preferencias y datos no sensibles
setcookie('vista_preferida', 'lista', time() + (365 * 24 * 60 * 60));
setcookie('ciudad_usuario', 'Madrid', time() + (30 * 24 * 60 * 60));
setcookie('cookies_aceptadas', 'true', time() + (365 * 24 * 60 * 60));
// Combinar ambas tecnologías
if (isset($_COOKIE['tema_usuario'])) {
$_SESSION['tema_actual'] = $_COOKIE['tema_usuario'];
} else {
$_SESSION['tema_actual'] = 'claro'; // Valor por defecto
}
?>
Fuentes y referencias
Documentación oficial y recursos externos para profundizar en PHP
Documentación oficial de PHP
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, PHP es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de PHP
Explora más contenido relacionado con PHP y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
- Comprender el concepto y funcionamiento de las sesiones en PHP.
- Aprender a iniciar, modificar, validar y destruir sesiones.
- Entender cómo crear, configurar, recuperar y eliminar cookies.
- Diferenciar usos prácticos entre sesiones y cookies.
- Implementar ejemplos básicos de autenticación y gestión de preferencias con sesiones y cookies.