2012-09-26 11 views
14

Tengo un problema extraño en mi sistema de administración de pruebas en línea.¿Cómo mantener viva la sesión sin tener que volver a cargar la página?

Algunos usuarios en el formulario de prueba (test.php) necesitan mucho tiempo para responder la pregunta y enviar el formulario.

Después de enviar el formulario de la sesión ha expirado y el usuario debe ingresar nuevamente

esto no es un problema de código

que establece este valor en la parte superior de todas las páginas

ini_set('session.gc_maxlifetime', 18000); 

¿Existe una forma de actualizar la sesión evrey 10 minutos sin volver a cargar la página en forma de prueba para evitar que caduque la sesión?

Por favor, ayúdame

Gracias

+0

¿Se pueden hacer algunas llamadas ajax? ¿Podrías describir tu guión un poco más? Puede ser que algunos ejemplos de código ayuden :) – Gogol

+0

Interesante. Estoy lidiando con un problema similar, pero mi opinión al respecto es que uno debe evitar reiniciar automáticamente el tiempo de espera de la sesión en un intervalo, ya que eso creará efectivamente una sesión infinita que persistirá siempre que la ventana del navegador esté abierta. En su lugar, sugiero que aumente su vida útil máxima y que el tiempo de espera se pueda actualizar en función de la acción del usuario. Incluso el movimiento del mouse podría hacer el truco, iniciar un temporizador una vez que se mueva el mouse. A menos que se incluya algún componente de interacción del usuario, crea un gran agujero de seguridad. Las sesiones están diseñadas para caducar. –

Respuesta

25

Puede usar javascript XHR, o como otros lo llaman, AJAX.

uso de AJAX puede llamar a un script PHP que refresca su sesión cada 10 minutos. :)


Esto es lo más lejos que puedo llegar a "exacto".

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. 
?> 

De todos modos, otra solución sería la de extender el tiempo de la sesión de la página de prueba utilizando sólo la solución que aquí se presenta

How do I expire a PHP session after 30 minutes?

+0

necesito más ayuda ¿me puede dar el código exacto? –

+1

actualizó mi respuesta :) – sheeks06

+8

En el script PHP, ¿no es 'session_start()' solo lo suficiente? –

9

Todo lo que necesita es este (utiliza jQuery para el $ .post):

JavaScript (poner esto dentro de su proceso de carga-función o algo así)

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']; 
    } 
?> 

(Sé que esto es más o menos lo mismo que la respuesta aceptada, realmente quería comentar sobre ese pero aún no tengo suficiente reputación.
El mayor cambio está en JavaScript, no necesita una función completa, solo una línea.)



Información adicional:

Aunque creo que es suficiente con sólo llamar session_start() en el php, si leo este derecho (http://nl3.php.net/function.session-start):

La devolución de llamada de lectura recuperará cualquier dato de sesión existente (almacenado en un formato serializado especial ) y será deserializado y utilizado para autom poblar aticalmente el superglobal $ _SESSION cuando la devolución de llamada devuelve los datos de la sesión guardada al manejo de la sesión PHP.

Y durante las pruebas solo pongo el código anterior en mi página de visitante, y no en la página de administración. Pero tenía ambas páginas abiertas en el mismo navegador (Chrome), y la página de administración permanecía registrada también, al menos durante más de una hora (no comprobé por más tiempo). PERO, no sé si todavía funciona si sólo utiliza session_start(), sin actualizar manualmente cualquier sesión-var a todos ..

De cualquier manera, me gusta estar seguro de que la sesión de VARs que necesitan en realidad todavía están allí :)

+0

Su "INFORMACIÓN ADICIONAL" no parece ser cierta. Tengo el mismo problema. Creé una llamada ajax (ping/pong) al servidor tratando de mantener viva mi sesión. Para prueba prupose ejecuta cada 5 minutos. Nomatter qué, me quitaron la autenticación después de aproximadamente 2 horas.Ahora probando la sesión alterando aprouch. –

+0

@FlipVernooij entonces, ¿cómo fue el "enfoque de modificación de sesión"? –

Cuestiones relacionadas