2010-01-28 12 views
6

Tengo una clase de controlador de sesión que llama a session_write_close() al final de la secuencia de comandos. Esto asegura que incluso si se emite un encabezado() o exit(), los datos de la sesión se guardan.Problemas de PHP con sesiones simultáneas y AJAX

public function __destruct() 
{ 
    session_write_close(); 
} 

Sin embargo, me he dado cuenta de que para una de mis páginas AJAX dos actualizaciones de sesión son cometidos por la capa de base de datos.

Supongo que la página [1] carga y envía una [2] solicitud AJAX. Esa [2] solicitud AJAX debe iniciar la sesión antes de que la página [1] tenga la oportunidad de llamar al session_write_close().

Después de que la página [2] AJAX ha cargado la sesión, la página [1] finalmente guarda la sesión y poco después la solicitud [2] AJAX guarda su sesión, ¡que sobrescribe la primera!

Se podría tener este aspecto:

[1] page loads session 
[1] page sends output 
[2] ajax loads session 
[1] page saves session 
[2] ajax sends output 
[2] ajax saves session 

¿Qué debo hacer para asegurarse de que una página no se carga una sesión antes de que otro tiene la oportunidad de guardar la sesión?

+0

Esto es muy interesante ... Nunca he tenido este problema (tocar el silicio) a pesar de toneladas de uso de Ajax para todo tipo de propósitos, así que estoy interesado en las respuestas al respecto. – prodigitalson

Respuesta

3

La suposición era incorrecta.

... datos de sesión está protegida para evitar escrituras concurrentes sólo un script puede operar en una sesión en cualquier momento http://us.php.net/session_write_close

En otras palabras, usted podría estar ejecutando 100 peticiones AJAX para un usuario al mismo tiempo y cada uno esperaría su turno.

Mi problema ha resultado ser un error al seleccionar la columna de la tabla de sesión correcta, lo que ha provocado que mis sesiones se vuelvan a crear en cada carga.

+0

..que explicaría la falta de información sobre este "problema" ... – Xeoncross