Sesión siendo refrescada en segundo plano

Evitar expiración de sesión de PHP

Hoy vamos a ver cómo evitar que una sesión de PHP expire, es decir, prevenir o evitar la expiración de una sesión en PHP.

Para ello vamos a usar un poco de JavaScript.

La lógica

Sin importar si cambiamos el valor de session.gc_maxlifetime la sesión siempre va a expirar si el usuario no refresca la página o la sesión por determinado tiempo.

Por ejemplo, puede haber un formulario que debe llenarse en el transcurso del día, si se inicia sesión al inicio, cuando se quiera enviar al final del día la sesión habrá expirado y el trabajo estará perdido.

Para evitar que una sesión expire debemos estar refrescándola, esto es, hacer que el usuario refresque una página o ejecuta un script de PHP cada cierto tiempo para indicar que “sigue ahí”.

Como no podemos hacer que nuestros usuarios lo hagan manualmente podemos usar JavaScript para que haga peticiones AJAX en segundo plano cada determinado tiempo, y en esa petición refrescar la sesión. De esa forma la sesión no se cierra por inactividad.

Evitar expiración de sesión en PHP

Antes de todo, el usuario debe haber iniciado sesión ya sea desde un formulario de login o desde cualquier otro lugar.

Comencemos. Primero debemos tener un script que llame a session_start() para refrescar la sesión; puedes comprobar si la sesión no está iniciada, o usar @ para silenciar errores de que la sesión ya se había iniciado.

En este caso para fines prácticos lo haré con @ para silenciar errores así que:

<?php
@session_start();
# Eso es todo, ahora solo hay que llamar a este archivo cada cierto tiempo

Ahora en cada página o en la página en donde el usuario estará sin mover otra cosa que reinicie la sesión, debemos hacer que un script de JS haga una petición HTTP al archivo de PHP cada cierto tiempo.

Para ejecutar algo cada cierto tiempo usamos setInterval, y para las peticiones HTTP se pueden usar varias cosas, por ejemplo fetch, que es una función nativa y moderna.

Por lo tanto, cada 5 segundos visitamos al script:

document.addEventListener("DOMContentLoaded", function(){
    // Invocamos cada 5 segundos ;)
    const milisegundos = 5 *1000;
    setInterval(function(){
        // No esperamos la respuesta de la petición porque no nos importa
        fetch("./refrescar.php");
    },milisegundos);
});

Y ese script lo colocamos dentro de una página PHP o HTML:

<?php
?><!DOCTYPE html>
<html lang="es">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Mi página web</title>
    </head>
    <body>
        <p>Aquí el usuario puede tardar lo que quiera, su sesión no se va a
            cerrar por inactividad</p>
        <script>
            document.addEventListener("DOMContentLoaded", function(){
                // Invocamos cada 5 segundos ;)
                const milisegundos = 5 *1000;
                setInterval(function(){
                    // No esperamos la respuesta de la petición porque no nos importa
                    fetch("./refrescar.php");
                },milisegundos);
            });
        </script>
    </body>
</html>

Si notas que incluí las etiquetas en el encabezado fue para que se reconociera la sintaxis. Con eso es suficiente. Con este enfoque, cada 5 segundos se estará abriendo el archivo refrescar.php, lo que será como si el usuario estuviera navegando activamente, evitando la expiración de la sesión.

En las herramientas de depuración de Chrome se pueden ver las peticiones, lo cual demuestra que efectivamente el script de PHP que refresca la sesión está siendo invocado:

Evitar expiración de sesión PHP

Recuerda que puedes cambiar el intervalo de tiempo, incluso con 5 minutos quedaría bien.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

11 comentarios en “Evitar expiración de sesión de PHP”

  1. Hice un pequeño módulo y siempre tenía el mismo problema con la sesión 🙁 Ahora gracias a su ayuda ya trabaja bien. Muchísimas gracias y bendiciones.

  2. Le gradezco mucho su ayuda. Hice un pequeño módulo y tenía el mismo problema… siempre se terminaba cerrando la sesión :(. Pero con su ayuda lo solucioné. Muchísimas gracias.

  3. Llevo con este problema por meses y voy a usar esta solucion gracias.
    Ahora mi pregunta como sabemos cuanto dura la sestion para no tener que hacerlo cada 5 segundos y poder extenderlo un poco mas.?
    Gracias.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *