php

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:

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.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

3 días hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

1 semana hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

1 semana hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

1 semana hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

1 semana hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

1 semana hace

Esta web usa cookies.