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

Servidor HTTP en Android con Flutter

El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…

4 días hace

Imprimir automáticamente todos los PDF de una carpeta

En este post te voy a enseñar a designar una carpeta para imprimir todos los…

5 días hace

Guía para imprimir en plugin versión 1 desde Android

En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…

1 semana hace

Añadir tasa de cambio en sistema de información

Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…

2 semanas hace

Comprobar validez de licencia de plugin ESC POS

Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…

2 semanas hace

Imprimir euro € en impresora térmica

Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…

4 semanas hace

Esta web usa cookies.