Time out sessioni

Salve, ho impostato il timeout delle sessioni con il comando

ini_set('session.gc_maxlifetime',1*60);

Dopo 60 secondi mi aspetto che il sito non sia più navigabile e inceve la sessione rimane e riesco a vedere tutte le pagine. In pratica mi aspetto che dopo 60 secondi cliccando su un link di una home page io non riesca a vedere la pagina avente il seguente codice:

<?php

ini_set('session.gc_maxlifetime',1*60);

session_start();

if ($_SESSION['username']=="")

echo "Non Sei autorizzato";

else

{

?>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<title>Documento senza titolo</title>

</head>

<body >

<table  border="0" align="center">

  <tr>

    <td height="630" valign="top"><div align="center">Galleria</div></td>

  </tr>

</table>

</body>

</html>

<?

}

?>

Come mai?

inviato 8 anni fa
MGbyte78
X 0 X

La direttiva gc_maxlifetime indica al garbage collector (lo spazzino dei dati di sessione) il tempo di inutilizzo oltre il quale considerare "immondizia" i dati di sessione.

Il garbage collector però non viene richiamato ad ogni pagina richiesta bensì in maniera casuale, con una probabilità definita dalle direttive session.gc_probability e session.gc_divisor. In altre parole è vero che dopo gc_maxlifetime i dati di sessione vengono cancellati dal server ma il garbace collector potrebbe essere avviato molto dopo questo tempo.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

...indi che si potrebbe fare??

risposto 8 anni fa
larchitetto
X 0 X

Scusate se mi intrometto   ^-^ ma non si può utilizzare i cookie che danno la durata della sessione desiderata? :bye:

risposto 8 anni fa
EKELON77
X 0 X
Scusate se mi intrometto   ^-^ ma non si può utilizzare i cookie che danno la durata della sessione desiderata? :bye:

si, ovvero si può usare la funzione

session_set_cookie_params($numero_secondi_durata_sessione);

da mettere appena prima di ciascuna chiamata a session_start()

Ovviamente questa tecnica funziona solo se si usano i cookie per propagare l'ID di sessione.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Il problema è che i cookie sono presenti solo se l'utente quando effettua il login clicca sul pulsante checkbox (il famoso "ricordami") e quindi non funzionerebbe sempre il parametro session_set_cookie_params($numero_secondi_durata_sessione);

Come potrei fare?

risposto 8 anni fa
MGbyte78
X 0 X

Il problema è che i cookie sono presenti solo se l'utente quando effettua il login clicca sul pulsante checkbox (il famoso "ricordami") e quindi non funzionerebbe sempre il parametro session_set_cookie_params($numero_secondi_durata_sessione);

Come potrei fare?

Non è affatto vero. Le sessioni di default usano i cookie per propagare il Session ID. La funzionalità "ricordami" funziona sempre con un cookie, ma non è quello utilizzato dalla sessione!

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Ho fatto una prova, ho messo nella home page e in una pagina privata il codice:

session_set_cookie_params('1');

Mi aspettavo che dopo un minuto il sito non fosse più navigabile in quanto la sessione doveva scadere no? e invece niente, dove sbaglio?

risposto 8 anni fa
MGbyte78
X 0 X

prova con:

session_set_cookie_params(1);

la sessione deve scadere dopo un secondo.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Se non dovesse andare prova così...

Quando l'utente si autentifica memorizzi in sessione in che momento si è loggato   e ogni visita che fa controlli il tempo trascorso. Se sono passati piu di 60 secondi fai l'unset della sessione.

ti scrivo una bozza di pseudo-codice:

if(l'utente si è appena loggato)
{
   $_SESSION['start']=time();
}
else ( l'utente è già loggato)
{
   
   $_SESSION['now']=time();
   $secondi_trascorsi=$_SESSION['now']-$_SESSION['start'];
   if ($secondi_trascorsi>60) 
  {
      unset(....); //qui metti le variabili di sessione da distruggere;
      unset(....);
  }else
      $_SESSION['start']=time();
  
}

Ho fatto una prova, ho messo nella home page e in una pagina privata il codice:

session_set_cookie_params('1');

Mi aspettavo che dopo un minuto il sito non fosse più navigabile in quanto la sessione doveva scadere no? e invece niente, dove sbaglio?

risposto 8 anni fa
Toto007
X 0 X

Comunque per durata della sessione si intente il tempo massimo tra una richiesta dell'utente e la successiva

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Grazie dell' aiuto!, sono riuscito in questa maniera:

$ora=time("H:i:s"); /* Imposto l'ora attuale che viene caricata ogni volta che richiamo una pagina dal menu in quanto tutto il sito lavora sulla index, cambia solo la parte centrale attraverso il metodo INCLUDE("PAGINA")*/

/*Se l'utente si è loggato assegno alla variabile $_SESSION[ora'] l'ora in cui ho effettuato il login e cioè:

 $_SESSION[ora'] =time("H:i:s"); */

if ($_SESSION['ora']!="")

{

$verifica_sessione=$_SESSION['ora'];

$controllo=$ora-$verifica_sessione;

      if ($controllo>5)

      {

      $sessione_scaduta='FAI IL LOGOUT';   

      }

      else

      {

      $_SESSION['ora']=$ora;

      }

}

Molto sinteticamente è così. Ora però ho il problema dei cookie. In pratica se l'utente mentre fa il login spunta la casella "ricordami" e poi chiude la pagina e la riapre l'utente viene ovviamente riconosciuto dal sistema senza fare il login, ma questo però non mi dà più la possibilità di controllare la sessione dell' utente perchè il  relativo codice di controllo funziona solamente se a $_SESSION['ora']  gli viene assegnato un valore e purtroppo questo valore lo si ottiene solo quando l'utente fa il login e non quando chiude il browser e lo riapre. Come faccio a gestire la sessione con i cookie seguendo questa logica?

risposto 8 anni fa
MGbyte78
X 0 X

Perchè non provi ad aggiornare quel tempo all'inizio di ogni pagina?

In questo modo avresti un timeout che si aggiorna ad ogni interazione dell'utente con il server.

risposto un anno fa
Sarcares
Grazie del consiglio ma sono passati "appena" 6 anni e non ricordo neanche più a che progetto stavo lavorando :)MGbyte78 un anno fa
ahahahahahah! Cazzo hai ragione! Avrei dovto controllare la data del topic probabilmente! Beh spero comunque che il suggerimento possa tornare utile a qualcuno in futuro come questo topic è stato utile per me :)Sarcares un anno fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda