2011-07-01 22 views
7

Tengo problemas con el manejo de sesiones en PHP (versión 5.2.10). Estoy usando las funciones mencionadas a continuación para las sesiones de inicio de sesión, cierre de sesión y validación.Error al destruir la sesión en PHP

 
login() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    session_regenerate_id(true); 
    $_SESSION['user_id'] 
} 

validate_session() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    if (isset($_SESSION['user_id']) === FALSE) { 
     session_destroy(); 
     logout(); 
     header("Location: login_page"); 
    } 
} 

logout() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    $_SESSION = array(); 
    setcookie(session_name(), '', time() - 3600, '/'); 
    session_destroy(); 
} 

Cada página primero realiza una llamada a la función validate_session(). Si la sesión no es válida, redirige a la página de inicio de sesión. La función login() se usa para crear la sesión para el usuario. Cuando el usuario hace clic en cerrar sesión, se llama a la función logout() para destruir la sesión.

El problema es: la función de cierre de sesión al azar() lanza la advertencia:
Advertencia: session_destroy(): Objeto de la destrucción sesión fallida

Estoy consiguiendo este aviso con muy poca frecuencia. Como de 20 a 30 llamadas para cerrar sesión, lo recibo una vez. ¿Alguna idea?

Estoy desarrollando en una máquina de Windows XP.

Actualización: las sesiones se almacenan en el sistema de archivos.
Ruta: C: \ WINDOWS \ Temp

+1

Parece que ha pasado un largo tiempo desde que ha aceptado ninguna respuesta en stackoverflow .. –

+1

¡Sí! No he estado muy activo en stackoverflow. Y en algunos casos todavía no tengo una respuesta satisfactoria. – Varun

+0

Hola Varun, ¿Puedes explicar por qué usas el viaje igual en esa comparación? Por lo general, si (! Isset()) fuera suficiente, sé que es más blindado pero isset() solo debería devolver un valor booleano. ¿Realmente necesita validar su tipo? Probablemente no sea probable, pero tal vez eso de vez en cuando vuelva a ser verdad cuando no debería? – picus

Respuesta

0

¿Cómo está almacenando sus sesiones? Si se basa en archivos, ¿puede ser un error de tiempo de espera o de permisos?

Además, me pregunto si regenerate_id hace que la función de destrucción busque una sesión que técnicamente ya no exista. ¿Has intentado configurar ese argumento booleano en falso en la función regenerar?

Tuvimos este problema en una aplicación de CakePHP, pero lo corrigimos mediante un jigger con la configuración de Cake.

+0

sesión se almacenan en el sistema de archivos. También intenté con lo que sugirió, pero aún así recibí este error una vez. Como mencioné, el error ocurre con muy poca frecuencia (a veces una vez al día), es muy difícil para mí hacer algunos cambios y luego ver si se ha solucionado el problema. – Varun

+0

Otra pregunta, ¿el usuario realmente se desconectó cuando aparece la advertencia? O más al grano, aparte de la advertencia, ¿está funcionando todo lo demás? Si es así, podría considerar suprimir la advertencia hasta que lo tenga calculado, es decir, si este es un entorno de producción. – picus

0

Encontrados something que pueden ser útiles en este tema. Las preocupaciones básicas son:

  1. Si la sesión es válida para empezar, ¿cuál es el valor de retorno de session_start()?
  2. Si los archivos de sesión existen en PHP.ini session.save_path y se pueden eliminar.

Sospecho que en su caso es el primero. No recuerdo dónde, pero creo que he visto el caso en el que la sesión se invalidó a sí misma y luego intenté repetir el proceso por algún motivo.

2

¿El cierre de sesión() se llama en otro lugar que en validate_session()? Si no es así, el problema podría ser la llamada a session_destroy() antes de cerrar la sesión()

Usted podría intentar esto:

validate_session() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    if (!isset($_SESSION['user_id'])) { 
     logout(); 
     header("Location: login_page"); 
    } 
} 

logout() 
{ 
    $_SESSION = array(); 
    setcookie(session_name(), '', time() - 3600, '/'); 
    session_destroy(); 
} 
+0

Esta es también mi solución preferida, agregar el session_destroy a la función de cierre de sesión en lugar de a la función validate_session() tiene sentido lógico. Una de las ventajas de esta solución es evitar que se cree una nueva sesión en la página de cierre de sesión, lo que anulará la necesidad de duplicar las funciones de session_destroy(). –

Cuestiones relacionadas