2012-09-26 31 views
14

Ho uno strano problema nel mio sistema di gestione dei test online.Come mantenere attiva la sessione senza ricaricare la pagina?

Alcuni utenti nel modulo di test (test.php) hanno bisogno di molto tempo per rispondere alla domanda e inviare il modulo.

Dopo l'invio del modulo la sessione è scaduta e l'utente deve accedere di nuovo

questo non è un problema di codice

ho impostato questo valore in cima a tutte le pagine

ini_set('session.gc_maxlifetime', 18000); 

C'è un modo per aggiornare la sessione evrey 10 minuti senza ricaricare la pagina in forma di test per impedire la scadenza della sessione?

Please help me

Grazie

+0

Si può fare qualche chiamata Ajax? Potresti descrivere il tuo copione un po 'di più? Alcuni esempi di codice potrebbero aiutare :) – Gogol

+0

Interessante. Ho a che fare con un problema simile ma la mia opinione in merito è che si dovrebbe evitare di reimpostare automaticamente il timeout della sessione in un intervallo in quanto creerà effettivamente una sessione infinita che persisterà fino a quando la finestra del browser sarà aperta. Invece suggerisco di aumentare la durata massima e il timeout può essere aggiornato in base all'azione dell'utente. Anche il movimento del mouse potrebbe fare il trucco, avviare un timer una volta che il mouse viene spostato. A meno che non sia incluso un componente di interazione dell'utente, crea un grande buco di sicurezza. Le sessioni sono progettate per scadere. –

risposta

25

È possibile utilizzare JavaScript XHR, o come altri lo chiamano, AJAX.

utilizzando AJAX è possibile chiamare uno script php che rinfresca la sessione ogni 10 minuti. :)


Questo è quanto posso andare su "esatto".

javascript

var refreshSn = function() 
{ 
    var time = 600000; // 10 mins 
    settimeout(
     function() 
     { 
     $.ajax({ 
      url: 'refresh_session.php', 
      cache: false, 
      complete: function() {refreshSn();} 
     }); 
    }, 
    time 
); 
}; 

refresh_session.php

<?php 
session_start(); 

// store session data 
if (isset($_SESSION['id'])) 
$_SESSION['id'] = $_SESSION['id']; // or if you have any algo. 
?> 

In ogni caso, un'altra soluzione potrebbe essere quella di estendere il tempo di sessione per la pagina di test utilizzando solo la soluzione qui presentata

How do I expire a PHP session after 30 minutes?

+0

ho bisogno di più aiuto puoi darmi il codice esatto? –

+1

aggiornato la mia risposta :) – sheeks06

+8

Nello script PHP, non è 'session_start()' solo abbastanza? –

9

Tutto ciò che serve è questo (utilizza jQuery per il $ .post):

JavaScript (mettere questo all'interno del vostro onload-funzione o qualcosa)

setInterval(function(){$.post('path/to/refresh_session.php');},600000); //refreshes the session every 10 minutes 

refresh_session.php

<?php 
    session_start(); 

    if (isset($_SESSION['token'])) { //if you have more session-vars that are needed for login, also check if they are set and refresh them as well 
    $_SESSION['token'] = $_SESSION['token']; 
    } 
?> 

(so che questo è praticamente la stessa risposta accettata, volevo davvero commentare quello ma non ho ancora abbastanza reputazione.
Il più grande cambiamento è nel JavaScript, non è necessaria un'intera funzione, solo una riga.)



INFORMAZIONI SUPPLEMENTARI:

Anche se penso che sia abbastanza per chiamare solo session_start() in php, se ho letto questo diritto (http://nl3.php.net/function.session-start):

La richiamata lettura recupererà qualsiasi dato di sessione esistente (memorizzato in un formato serializzato speciale ) e verrà non serializzato e utilizzato per autom popola regolarmente il $ _SESSION superglobale quando il callback di lettura restituisce i dati di sessione salvati alla gestione della sessione di PHP.

E durante il test ho inserito il codice precedente solo nella pagina dei visitatori e non nella pagina di amministrazione. Ma avevo entrambe le pagine aperte nello stesso browser (Chrome), e la pagina di amministrazione rimaneva loggata, almeno per più di un'ora (non ho più controllato). MA, non so se funziona ancora se si usa solo session_start(), senza aggiornare manualmente qualsiasi sessione-var a tutti ..

Ad ogni modo, mi piace essere sicuri che le session-vars ho bisogno sono davvero ancora lì :)

+0

Il tuo "EXTRA INFO" non sembra essere vero. Sto avendo lo stesso problema. Crea una chiamata Ajax (ping/pong) al server cercando di mantenere viva la mia sessione. Per i test prontati in esecuzione ogni 5 minuti. Nomaterio, mi autodenuncia dopo circa 2 ore.Ora prova la sessione alterando l'aprouch. –

+0

@FlipVernooij, quindi come è andato l'approccio di "alterazione della sessione"? –

Problemi correlati