2014-06-25 48 views
8

Anche se questa domanda ha più duplicati non sono riuscito a trovare la soluzione adeguata per me. Hai bisogno di aiuto.PHP - Session distrugge dopo la chiusura del browser

Ho utilizzato ini_set('session.cookie_lifetime', 0); nel mio file di configurazione.

Ma non mi sta aiutando a distruggere la sessione sulla chiusura del browser.

Applicazione flusso di corrente:

1) Nella pagina di autenticazione se l'utente è valido, generare nuovo identificatore sessione utilizzando session_regenerate_id(true);

2) di controllo va a welcome.php dove comincio nuova sessione utilizzando session_start();

3) nel codice della pagina di logout è

 $_SESSION = array(); 
     if (ini_get("session.use_cookies")) { 
     $params = session_get_cookie_params(); 
     setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
    } 
    // Finally, destroy the session. 
    session_destroy(); 
+0

Si prega di elaborare di più. Cosa intendi per "distruggi sessione"? – zerkms

+0

Voglio chiudere la sessione esistente se l'utente chiude il browser. Se l'utente riapre il browser, desidero inviarlo di nuovo. – Shri

+0

cosa significa "chiudere la sessione esistente"? – zerkms

risposta

6

Il modo migliore è quello di chiudere la sessione è: se non v'è alcuna risposta per quella sessione dopo determinato intervallo di tempo. quindi vicino. Si prega di consultare questo post e spero che risolverà il problema."How to change the session timeout in PHP?"

4

Ci sono diversi modi per farlo, ma il server non può rilevare quando il browser viene chiuso, quindi distruggerlo è difficile.

  • sessione di timeout.

Creare una nuova sessione con l'ora corrente o aggiungere una variabile di tempo alla sessione corrente. e quindi controllarlo quando si avvia o eseguire un'azione per vedere se la sessione deve essere rimossa.

session_start(); 
$_SESSION["timeout"] = time(); 
//if 100 seconds have passed since creating session delete it. 
if(time() - $_SESSION["timeout"] > 100){ 
    unset($_SESSION["timeout"]; 
} 
  • ajax

Fare javascript effettuare una chiamata AJAX che eliminare la sessione, con onbeforeunload() una funzione JavaScript che chiama un'azione finale quando l'utente lascia la pagina. Per qualche motivo questo non funziona sempre però.

  • cancellarlo all'avvio.

Se si desidera sempre che l'utente visualizzi la pagina di accesso all'avvio dopo che la pagina è stata chiusa, è sufficiente eliminare la sessione all'avvio.

<? php 
session_start(); 
unset($_SESSION["session"]); 

e probabilmente ce ne sono ancora.

0

utilizzare il seguente codice di distruggere la sessione:

<?php 
    session_start(); 
    unset($_SESSION['sessionvariable']); 
    header("Location:index.php"); 
    ?> 
+0

Questo va bene se l'utente fa clic su Disconnetti. Penso che Shri voglia assicurarsi che la sessione venga distrutta ogni volta che l'utente chiude il browser. La sessione – mishka

+0

viene automaticamente distrutta alla chiusura del browser – user3774008

+0

Leggere prima la domanda –

1

è possibile farlo utilizzando JavaScript innescando una richiesta AJAX al server di distruggere la sessione onbeforeunload licenziato quando si chiude la scheda Sfoglia o finestra o browser.

7

Utilizzare un keep alive.

Su login:

session_start(); 
$_SESSION['last_action'] = time(); 

una chiamata AJAX ogni pochi (ad esempio 20) secondi:

windows.setInterval(keepAliveCall, 20000); 

Server lato keepalive.php:

session_start(); 
$_SESSION['last_action'] = time(); 

Su ogni altra azione:

session_start(); 
if ($_SESSION['last_action'] < time() - 30 /* be a little tolerant here */) { 
    // destroy the session and quit 
} 
+0

Questa è una soluzione per l'uomo piccolo. perché? perché se cambi la sessione deve essere riscritta alla fine dello script. Se si dispone di un sito Web di grandi dimensioni, si tratta di un gran numero di I/O solo per gli utenti di disconnessione automatica. – Umingo

+1

@Umigo: non è necessario utilizzare i file come archiviazione di sessione. PHP fornisce ad esempio Memcache come alternativa. – colburton

+0

La risposta migliore e più semplice su come verificare se un utente è online o offline (y) – Syno

0

C'è un altro "hack" utilizzando referer (abbiamo asume quella finestra del browser era il nome di referer corrente di riposo di dominio e il nome di dominio di pagina curent non corrispondono):

session_start(); 
$_SESSION['somevariable'] = 'somevalue'; 

if(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_HOST) != $_SERVER["SERVER_NAME"]){ 
    session_destroy(); 
} 

Questo ha anche alcuni svantaggi, ma mi ha aiutato alcune volte.

Problemi correlati