sirven - session php
PHP: almacenando ''objetos'' dentro de $_SESSION (8)
En mi experiencia, generalmente no vale la pena por algo más complicado que un StdClass con algunas propiedades. El costo de la desesterilización siempre ha sido más que volver a crear desde una base de datos con un identificador almacenado en la sesión. Parece genial, pero (como siempre), el perfil es la clave.
Me acabo de dar cuenta de que puedo almacenar objetos en $ _SESSION y me parece genial porque cuando voy a otra página sigo teniendo mi objeto. Ahora, antes de comenzar a usar este enfoque, me gustaría saber si realmente es una buena idea o si hay riesgos potenciales involucrados.
Sé que si tuviera un solo punto de entrada no tendría que hacer eso, pero aún no estoy allí, así que no tengo un solo punto de entrada y realmente me gustaría conservar mi objeto porque no lo hago. pierdo mi estado así. (Ahora también he leído que debería programar sitios sin estado pero aún no entiendo ese concepto).
En resumen : ¿está bien almacenar objetos en la sesión? ¿Hay algún problema con eso?
Editar:
Resumen temporal : ahora entiendo que probablemente sea mejor volver a crear el objeto, incluso si implica volver a consultar la base de datos.
¡Otras respuestas podrían tal vez dar más detalles sobre ese aspecto !
Está bien siempre y cuando se realice la llamada session_start (), la declaración / definición de clase ya haya sido encontrada por PHP o pueda ser encontrada por un autocargador ya instalado. de lo contrario, no podría deserializar el objeto del almacén de sesiones.
HTTP es un protocolo sin estado por una razón. Sesiones de soldadura de estado en HTTP. Como regla general, evite usar el estado de la sesión.
ACTUALIZACIÓN: no hay concepto de una sesión en el nivel HTTP; los servidores lo proporcionan dando al cliente una identificación única y diciéndole al cliente que vuelva a enviarla en cada solicitud. Luego, el servidor usa esa ID como clave en una gran tabla hash de objetos Session. Cada vez que el servidor recibe una solicitud, busca la información de sesión fuera de su tabla hash de objetos de sesión en función de la ID que el cliente envió con la solicitud. Todo este trabajo adicional es un doble golpe en la escalabilidad (una gran razón por la cual HTTP es sin estado).
- Whammy One: reduce el trabajo que un solo servidor puede hacer.
- Whammy Two: hace que sea más difícil escalar porque ahora no puedes enrutar una solicitud a cualquier servidor anterior; no todos tienen la misma sesión. Puede anclar todas las solicitudes con una ID de sesión determinada en el mismo servidor. No es fácil, y es un punto único de falla (no para el sistema en general, sino para grandes cantidades de usuarios). O bien, podría compartir el almacenamiento de la sesión en todos los servidores del clúster, pero ahora tiene más complejidad: memoria conectada a la red, un servidor de sesión independiente, etc.
Teniendo en cuenta todo eso, cuanta más información pongas en la sesión, mayor será el impacto en el rendimiento (como señala Vinko). Además, como señala Vinko, si su objeto no es serializable, la sesión se comportará mal. Por lo tanto, como regla general, evite poner más de lo absolutamente necesario en la sesión.
@Vinko Por lo general, puede evitar tener el estado de la tienda del servidor incrustando los datos que está rastreando en la respuesta que envía de vuelta y hacer que el cliente lo vuelva a enviar, por ejemplo, enviar los datos en una entrada oculta. Si realmente necesita un seguimiento del estado del servidor, probablemente debería estar en su almacén de datos de respaldo.
(Vinko agrega: PHP puede usar una base de datos para almacenar información de sesión, y hacer que el cliente vuelva a enviar los datos puede resolver problemas potenciales de escalabilidad, pero abre una gran lata de problemas de seguridad a los que debe prestar atención ahora que el cliente tiene el control de todos tu estado)
Sé que este tema es antiguo, pero este problema sigue apareciendo y no se ha abordado a mi entera satisfacción:
Ya sea que guarde objetos en $ _SESSION, o los reconstruya todo en base a datos ocultos en campos de formularios ocultos, o los vuelva a consultar desde el DB cada vez, está usando state. HTTP es sin estado (más o menos, pero vea GET vs. PUT) pero casi todo lo que a alguien le importa hacer con una aplicación web requiere que se mantenga el estado en alguna parte. Actuar como si empujar al estado a rincones y grietas equivale a algún tipo de victoria teórica es simplemente incorrecto. El estado es estado. Si usa estado, pierde las diversas ventajas técnicas obtenidas al ser apátrida. Esto no es algo para perder el sueño a menos que sepa de antemano que debe perder el sueño por ello.
Estoy especialmente desconcertado por la bendición recibida por los argumentos del "doble golpe" presentados por Hank Gay. ¿El OP está construyendo un sistema de comercio electrónico distribuido y balanceado de carga? Mi conjetura es no; y además postularé que la serialización de su clase $ User, o lo que sea, no paralizará su servidor más allá de la reparación. Mi consejo: usa técnicas que sean sensatas para tu aplicación. Los objetos en $ _SESSION están bien, sujetos a precauciones de sentido común. Si su aplicación se convierte de repente en algo que rivaliza con Amazon en el tráfico que recibe, tendrá que volver a adaptarse. Así es la vida.
Sugeriría que no uses el estado a menos que lo necesites absolutamente. Si puede reconstruir el objeto sin usar sesiones, hágalo. Tener estados en su aplicación web hace que la aplicación sea más compleja de construir, para cada solicitud debe ver en qué estado se encuentra el usuario. Por supuesto, hay momentos en los que no puede evitar el uso de la sesión (ejemplo: el usuario debe mantener el inicio de sesión durante su sesión la aplicación web). Por último, le sugiero que mantenga el objeto de sesión lo más pequeño posible, ya que afecta el rendimiento para serializar y deserializar objetos grandes.
También me gustaría plantearme al actualizar las bibliotecas de software: actualizamos nuestro software y la versión anterior tenía objetos en sesión con los nombres de clase del software V1, el nuevo software se bloqueaba cuando intentaba construir los objetos que estaban en la sesión, como el V2 el software ya no usaba esas mismas clases, no podía encontrarlas. Tuvimos que poner un código de corrección para detectar objetos de sesión, eliminar la sesión si se encuentra, volver a cargar la página. El mayor dolor al principio fue que recreara este error cuando se informó por primera vez (demasiado familiar, "bueno, me funciona" :) ya que solo afectó a las personas que entraban y salían recientemente de los sistemas antiguos y nuevos; sin embargo, bueno El trabajo lo encontramos antes del lanzamiento, ya que todos nuestros usuarios seguramente habrían tenido las viejas variables de sesión en sus sesiones y se habrían bloqueado para todos, hubiera sido un lanzamiento terrible :)
De todos modos, como sugieres en tu enmienda, también creo que es mejor volver a crear el objeto. Así que tal vez almacenar ID y luego en cada solicitud extraer el objeto de la base de datos sea mejor / más seguro.
Tendrá que recordar que los tipos de recursos (como conexiones db o punteros a archivos) no persistirán entre cargas de página, y deberá volver a crearlos de forma invisible.
También tenga en cuenta el tamaño de la sesión, dependiendo de cómo se almacena, puede tener restricciones de tamaño o problemas de latencia.
- Los objetos que no pueden ser serializados (o que contienen miembros no serializables) no saldrán del $ _SESSION como se esperaría
- Las enormes sesiones suponen una carga para el servidor (serializar y deserializar megas de estado cada vez es caro)
Aparte de eso, no he visto ningún problema.