Aquí está la cosa. Un colega mío está intentando sobrescribir el manejo de la sesión de un marco que usamos. Este marco utiliza el manejo de la sesión nativa de PHP de manera predeterminada, pero ahora está tratando de implementar una capa de base de datos entre las solicitudes.Aquí hay un verdadero desafío: ¿por qué PHP llama a la función de apagado antes de escribir las sesiones?
El problema es que el objeto de la base de datos no está disponible cuando las sesiones ya están escritas, pero está disponible para otras funciones, como cuando se leen datos de las sesiones. Este es un comportamiento salvaje. Esto es lo que hicimos:
register_shutdown_function('exithandler');
session_set_save_handler(
'sess_open',
'sess_close',
'sess_read',
'sess_write',
'sess_destroy',
'sess_gc'
);
Cada una de estas funciones también se escribe una sola línea en nuestro archivo de registro que podamos hacer un seguimiento con el nombre de la función. Esto se hace cada vez que se llama a la función. Ahora, aquí hay dos URL que se solicitan, la primera es donde se escriben realmente las sesiones (datos nuevos para las sesiones) y la segunda donde simplemente se verifican los datos de la sesión (y no se escribe ninguno). Aquí está el acertijo:
/login/
sess_open
sess_read
exithandler
sess_write
sess_close
/account/
sess_open
sess_read
sess_write
sess_close
exithandler
¿Por qué es este comportamiento diferente? ¿Por qué se llama al manejador de salida antes de que se almacenen los datos en las sesiones y por qué no ocurre lo mismo con una página normal, a pesar de que efectivamente se invocan los mismos métodos?
El problema es que ninguna de nuestras clases ya está disponible después de llamar al manejador de salida, supongo que el recolector de basura de PHP ha llamado a los métodos __destruct() en todas nuestras clases y se han ido. Esto es simplemente malo.
¿Alguien sabe por qué PHP se comporta de esta manera?
¿Qué versión de PHP está utilizando? –
He probado esto usando PHP 5.4, y solo puedo reproducir el primer orden de operaciones para ambos tipos de solicitudes: Leer y escribir datos de sesión. – nickb
Existe un problema común con alguna versión de PHP que requiere que agregue una línea antes de llamar 'session_set_save_handler()'. Use esto primero: 'register_shutdown_function ('session_write_close')' y vea si eso soluciona su comportamiento inestable. –