(Pregunta): Como hacer que una $_SESSION determinada dure 2 horas.

Iniciado por Leguim, 2 Noviembre 2019, 18:57 PM

0 Miembros y 2 Visitantes están viendo este tema.

Leguim

Buenos días,
de forma global todas mis sessiones las modifique para que duren hasta que el usuario cierre el navegador, luego de eso se borran.

Código (php) [Seleccionar]

ini_set('session.cookie_lifetime', '0');
ini_set('session.gc_maxlifetime', '0');
session_start();


Pero como puedo hacer que determinada $_SESSION dure 2 horas sólo esa session...

engel lex

a la sesion agregale un tiempo y si se accede y el tiempo está vencido, la destruyes... es la forma segura... tambien puedes darle vencimiento a la cookie, pero ya sabes como son las cookies
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Leguim

Cita de: engel lex en  2 Noviembre 2019, 20:38 PM
a la sesion agregale un tiempo y si se accede y el tiempo está vencido, la destruyes... es la forma segura... tambien puedes darle vencimiento a la cookie, pero ya sabes como son las cookies

¡Hola, gracias por responder!

¿Como podría agregarle ese tiempo de vida a la $_SESSION? ¿Me podrías dar un simple ejemplo, por favor?

Gracias!

engel lex

simplemente un almacenas un time() y confirmas si time() menos el tiempo guardado es mayor a 7200 (ya que es en segundos)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Leguim

Creo haber entendido, según lo que entendí es que la $_SESSION guardará un time y luego preguntará si dicho time expiro pero... la $_SESSION tendrá X dato, un ID quizá (por ejemplo)...
ese será su contenido no el time()

WHK

El time va dentro del a session, puedes agregarle todas las variables que quieras, la sesion es simplemente un array llegar y llenar.

https://www.php.net/manual/es/book.session.php#90351

Leguim

Es decir, esto se puede hacer?

Código (php) [Seleccionar]

$_SESSION['test'] = 'Este es un mensaje';
$_SESSION['test'] = time();


Por supuesto no de esa manera, obviamente estoy sobre escribiendo en la variable datos diferentes, a lo que me refiero es, ¿esto es lo que me estan diciendo que haga? ¿poner time(); dentro de la $_session? ¿Como podría entonces hacer de dicha session un array?
¿No existe una forma de ponerle un tiempo de vida como se hace en las cookies?

Gracias.

engel lex

es eso... y en cada solicitud

Código (php) [Seleccionar]

if(time() - $_SESSION['test'] > 7200){
  #destruir sesión
}

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

WHK

Citar¿Como podría entonces hacer de dicha session un array?

Aver, creo que debes estudiar un poco más de php.

$_SESSION ya es un array y puedes escribir todas las llaves y valores que quieras de manera implícita:

Código (php) [Seleccionar]
$_SESSION['abc'] = 'def';

O de manera explícita:

Código (php) [Seleccionar]
$_SESSION = array('abc' => 'def');

Entonces, dentro de tu array de sesion multidimensional puedes poner todo lo que desees incluyendo un valor de tiempo que puedes ponerlo donde tu quieras y luego haces la comparación y haces un session_destroy(). Por ejemplo:

Código (php) [Seleccionar]

session_start();

if(!isset($_SESSION['data']))
{
    // Inicia la sesión
    $_SESSION = array(
        'data' => array(
            'usuario' => array(
                'id'     => 1,
                'nombre' => 'Demo'
            ),
            'permisos' => array(
            )
        ),
        'time' => time()
    );
}

if((time() - $_SESSION['time']) > 7200)
{
    // Sesión expirada

    // Elimina la sesión
    session_destroy();

    // Redirecciona al mismo script para renovar la sesión
    header('Location: /index.php');

    // Finaliza el script (previene el escape de información)
    exit;
}

@XSStringManolo

Solo añadir que debes poner siempre el session start al principio de todo porque si no, puede dar error.
Y que tambien puedes usar session unset en vez de session destroy.
Con destroy, borras todo el contenido de session, con unset se la quitas al usuario.

Por ejemplo imagínate que dejas al usuario estilizar tu página web para su perfil y se tira 2 horas configurando sus colores favoritos, fondo de la página, tamaño de texto, descripción... Está hablando por un chat, apuntó cosas... Y se le va la luz o el internet. Si haces destroy automático y el usuario no le dio a guardar, va a perder todo si no le dio a guardar.

En cambio si haces unset, toda la información la sigues teniendo en el servidor y cuando se loggea de nuevo puedes ponerle un mensaje:
"Tu última sesión se cerro inesperadamente". Botón RESTAURAR.