HOWTO · PHP

Establecer el tiempo de espera de la sesión en PHP

Este tutorial explica cómo controlar la inactividad en una sesión de PHP y aplicar un tiempo de espera de 30 minutos.

En esta página

PHP no expira automáticamente una sesión de la aplicación después de un periodo de inactividad determinado. Para aplicar un tiempo de espera de 30 minutos, guarda en $_SESSION la hora de la última solicitud, compárala con la hora actual en cada solicitud y actúa cuando la diferencia alcance o supere los 1.800 segundos. El tiempo de espera se detecta en la siguiente solicitud tras el periodo de inactividad; el servidor no puede actuar justo cuando el navegador deja de enviar solicitudes.

Cómo controlar el tiempo de espera de una sesión de PHP

Llama a session_start() antes de leer o modificar $_SESSION. En la primera solicitud no hay una hora de actividad guardada, así que debes inicializarla. En las solicitudes posteriores, compara la hora guardada con time(). Si se alcanza el límite de 1.800 segundos, borra los datos de la sesión y termina la solicitud; de lo contrario, actualiza la hora de actividad para que vuelva a empezar el periodo de 30 minutos.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

<?php
session_start();

$timeoutSeconds = 30 * 60;
$now = time();

if (isset($_SESSION['last_activity']) &&
    $now - $_SESSION['last_activity'] >= $timeoutSeconds) {
    session_unset();
    session_destroy();
    echo "Session expired" . PHP_EOL;
    exit;
}

$_SESSION['last_activity'] = $now;
echo "Session active" . PHP_EOL;
Session active

La primera solicitud inicializa last_activity y sigue la ruta activa. Cada solicitud posterior comprueba la marca de tiempo anterior antes de actualizarla. La evidencia de ejecución suministrada muestra Session active (el mensaje permanece en inglés) y un código de salida 0 para la ruta activa. No muestra la ejecución de la ruta de expiración. En una aplicación, coloca esta comprobación después de session_start() y antes de las operaciones protegidas, para que una solicitud cuya sesión haya expirado no se procese como autenticada.

Destruir una sesión tras 30 minutos de inactividad

Cuando vence el tiempo de espera, el ejemplo utiliza tanto session_unset() como session_destroy(). session_unset() elimina las variables de la sesión actual, mientras que session_destroy() elimina los datos de sesión almacenados por el controlador de sesión activo. Destruir los datos del servidor no elimina por sí solo la cookie de sesión del navegador. Si la aplicación también necesita caducar esa cookie, debe enviar una cookie caducada con la misma configuración de nombre, ruta y dominio; la gestión de cookies depende de la configuración de sesión de la aplicación.

Este es un tiempo de espera gestionado por la aplicación: solo se ejecuta cuando una solicitud llega al código que realiza la comprobación. La configuración del tiempo de vida del almacenamiento de sesiones de PHP controla la limpieza del almacenamiento y es independiente de esta política de inactividad comprobada en cada solicitud. Consulta el manual de PHP para session_unset() y las opciones de configuración de sesiones.

Eliminar una variable de sesión con unset()

Usa unset($_SESSION['cart']) para eliminar una entrada y mantener disponibles las demás entradas de la sesión. Es apropiado cuando un usuario elimina un dato concreto, como un carrito, sin terminar toda la sesión. Por sí solo, no implementa un tiempo de espera por inactividad. Para un grupo de valores relacionados, guárdalos bajo una clave de array y elimina solo esa clave con unset($_SESSION['account_state']); no sustituyas el array por una marca de tiempo si la comprobación posterior del tiempo de espera espera encontrar el elemento registered.

La superglobal $_SESSION está disponible después de llamar a session_start(). Consulta el manual de PHP para $_SESSION.

Regenerar el ID de sesión por separado de la gestión del tiempo de espera

session_regenerate_id() sustituye el identificador de sesión actual; no mide la inactividad, destruye los datos de sesión ni exige automáticamente que el usuario vuelva a iniciar sesión. Úsala para aplicar una política de rotación de identificadores en el momento adecuado del flujo de autenticación de la aplicación, de forma independiente de la comprobación del tiempo de espera. Que se conserven los datos de la sesión anterior depende de las opciones de la función y de la gestión de sesiones; por tanto, no consideres que la regeneración por sí sola equivale a cerrar la sesión ni demuestra que el identificador anterior ya no se pueda usar.

La función session_id() lee el identificador actual, mientras que session_start() reanuda la sesión asociada a la solicitud. Para más detalles, consulta el manual de PHP para session_regenerate_id() y la función session_id().