FUNCIONES PRINCIPALES DE SESIONES EN PHP

Las sesiones en PHP permiten almacenar información del usuario entre diferentes peticiones HTTP. El protocolo HTTP no tiene memoria, es stateless, el servidor olvida quien es el visitante en cuanto se cambia de enlace. Las sesiones solucionan este problema guardando la información en el servidor y asignando al navegador un identificador único, ID de sesión.

Casos de uso comunes

  • Sistemas de login: Validar si un usuario ha introducido sus credenciales correctamente para permitirle ver páginas restringidas.
  • Carritos de compra: Recordar qué productos ha añadido el cliente mientras sigue navegando por la tienda.
  • Mensajes flash: Mostrar notificaciones de éxito o error, por ejemplo "Datos guardados correctamente", después de redirigir un formulario.

Diferencias entre Sesiones y Cookies

Características Sesiones en PHP Cookies
Ubicación Se guardan en el servidor Se guardan en el navegador del usuario
Seguridad Alta. El usuario no puede alterar los datos directamente Baja. El usuario puede ver y modificar los valores
Capacidad Prácticamente ilimitada Limitada (normalmente hasta 4KB)
Expiración Expiran al cerrar el navegador o por inactividad Pueden durar meses o años si se configuran así

Funciones de Sesiones

Función Descripción Ejemplo de Uso
session_start() Inicia o reanuda una sesión existente session_start();
session_destroy() Destruye todos los datos de la sesión actual session_destroy();
session_regenerate_id(bool $delete_old_session = false) Genera un nuevo ID de sesión (muy importante por seguridad) session_regenerate_id(true);
session_id(?string $id = null) Obtiene o establece el ID de la sesión actual $id = session_id();
session_name(?string $name = null) Obtiene o cambia el nombre de la cookie de sesión session_name('mi_app_session');
session_unset() Limpia todas las variables de $_SESSION session_unset();
session_gc() Ejecuta la recolección de basura de sesiones (PHP 7.1+) session_gc();
session_status() Retorna el estado actual de la sesión if(session_status() === PHP_SESSION_ACTIVE)
session_write_close() Cierra la sesión y libera el bloqueo (útil en AJAX) session_write_close();
session_abort() Cancela los cambios y cierra la sesión sin guardarlos session_abort();
session_reset() Restaura los valores originales de la sesión session_reset();
session_set_save_handler() Define manejador personalizado (Base de datos, Redis, etc.) session_set_save_handler(...);
session_save_path(?string $path = null) Obtiene o establece la ruta donde se guardan las sesiones session_save_path('/tmp/sessions');
session_get_cookie_params() Obtiene los parámetros de la cookie de sesión $params = session_get_cookie_params();

Ejemplo Completo

// 1. Iniciar sesión
session_start();

// 2. Guardar datos en la sesión
$_SESSION['usuario_id'] = 145;
$_SESSION['nombre']     = "Carlos López";
$_SESSION['rol']   = "admin";
$_SESSION['login_time'] = time();

// 3. Leer datos
echo $_SESSION['nombre']; // Carlos López

// 4. Comprobar si existe una variable
if (isset($_SESSION['usuario_id'])) {
    echo "Usuario logueado";
}

// 5. Eliminar una variable específica
unset($_SESSION['rol']);

// 6. Destruir toda la sesión (logout)
session_unset();   // Limpia las variables
session_destroy(); // Destruye la sesión

Seguridad recomendada al hacer Login

session_start();

// Regenerar ID después de login (previene Session Fixation)
session_regenerate_id(true);

$_SESSION['usuario_id'] = $user->id;
$_SESSION['ip']    = $_SERVER['REMOTE_ADDR'];
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];

Cerrar sesión de forma segura

function logout()
{
    session_start();
    
    // Limpiar todas las variables
    $_SESSION = array();
    
    // Eliminar la cookie de sesión
    if (ini_get("session.use_cookies")) {
   $params = session_get_cookie_params();
   setcookie(session_name(), '', time() - 42000,
  $params["path"], $params["domain"],
  $params["secure"], $params["httponly"]
   );
    }
    
    session_destroy();
}

Usar cookies seguras

ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_samesite', 'Strict');
ini_set('session.cookie_secure', 1); // Solo HTTPS