Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Uso del patrón singleton y las sesiones

Estas en el tema de Uso del patrón singleton y las sesiones en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola buenas. He implementado una clase singleton que hereda de PDO para facilitarme la vida con las bvases de datos. Funciona correctamente, pero me surge ...
  #1 (permalink)  
Antiguo 17/11/2010, 06:20
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 10 meses
Puntos: 44
Uso del patrón singleton y las sesiones

Hola buenas. He implementado una clase singleton que hereda de PDO para facilitarme la vida con las bvases de datos.

Funciona correctamente, pero me surge un problema a la hora de procesar un nuevo request.
Lo que hacía antes, era conservar en la sesión un objeto serializado con la conexión a la base de datos.

Ahora con singleton, no se muy bien como abordar el problema.

qué soluciones elegantes se os ocurren? la sesión es el único modo eficiente?

saludos
  #2 (permalink)  
Antiguo 17/11/2010, 09:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Uso del patrón singleton y las sesiones

Debes de entender que PHP no soporta guardar en sesiones los recursos, en este caso aunque almacenes el objeto PDO en la sesión este se va a cerrar al final de la ejecución de tu script, y es un comportamiento nativo de PHP, el garbage collector cierra todas las variables y recursos (lease conexiones a la base de datos, punteros a archivos, conexiones de fsockopen, etc.).

Aparte de eso no se recomienda usar Singleton para bases de datos, es mejor mantener una clase registro y así controlar tus instancias, hay varios posts en este foro donde se explica porque no es recomendable Singleton para bases de datos.

Saludos.
  #3 (permalink)  
Antiguo 19/11/2010, 15:14
 
Fecha de Ingreso: noviembre-2010
Ubicación: León, Nic.
Mensajes: 13
Antigüedad: 14 años
Puntos: 1
Respuesta: Uso del patrón singleton y las sesiones

Cita:
Iniciado por GatorV Ver Mensaje
en este foro donde se explica porque no es recomendable Singleton para bases de datos.
Gracias GatorV, has evitado que cometiera un error garrafal, pues hace como 2 días supe que existía Singleton (aquí en este foro), y ayer diagramé mentalmente cómo crear una única instancia Singleton para el manejo de las conexiones, ahora con tu comentario investigaré más sobre el tema.

Mil gracias.
  #4 (permalink)  
Antiguo 24/11/2010, 13:13
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Información Respuesta: Uso del patrón singleton y las sesiones

Hola limbvirgin. Si el singleton no esta recomendado para conexiones a bases de datos, yo pensaba antes lo contrario, pero después de un análisis más profundo y de un largo debate con GatorV llegue a esa conclución "que no".

Puedes utilizar el Patrón Registry en vez del Singleton.

Aquí te dejo la implementacion:

http://www.forosdelweb.com/f18/duda-...4/#post3538212

Saludos.
  #5 (permalink)  
Antiguo 25/11/2010, 08:44
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 10 meses
Puntos: 44
Respuesta: Uso del patrón singleton y las sesiones

Gracias GatorV y atrianaster por el link.

He estado leyendo un poco sobre el Registry y bueno aun me surgen varias dudas respecto a su uso.

1 - ¿Si hago solo un include al archivo con la clase estática Registry al inicio de mi clase, al acceder al registro desde mi clase siempre accederé al mismo objeto? ¿O sería más útil pasar por referencia el registro al constructor del objeto y ya desde ahi utilizarlo?

2- ¿No hay una manera mas "transparente" de ultilizar el registro? Se me ocurrió usar la herencia pero no sé si será recomendable tener un clase abstracta que implemente el patrón y que las demás hereden de ella.

Saludos!
  #6 (permalink)  
Antiguo 25/11/2010, 09:41
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Información Respuesta: Uso del patrón singleton y las sesiones

Cita:
Iniciado por SetheR Ver Mensaje
¿O sería más útil pasar por referencia el registro al constructor del objeto y ya desde ahi utilizarlo?
El Patrón Registry lo único que hace es guardar variables, objetos lo que quieras guardar para un uso posterior, entiendase posterior a en el mismo entorno de ejecución, ya que cuando cambias de una página a otra todo lo que esta en el registro el garbage collector de php lo destruye. Puedes aprovechar el Registry solo por páguina.

Bueno decirte que en php5 los objetos se pasan por referencia y no por valor, es decir cuando asignas a una variable o un arreglo a un objeto lo que asignas es la referencia al objeto y no la copia(comportamiento de php4).

Cita:
Iniciado por SetheR Ver Mensaje
1 - ¿Si hago solo un include al archivo con la clase estática Registry al inicio de mi clase, al acceder al registro desde mi clase siempre accederé al mismo objeto?
Al acceder al registro de tu clase accederás al mismo objeto en dependencia:

El método add del registro asocia un identificador único a un valor que quieras guardar. Por ejemplo:

Código PHP:
Ver original
  1. $objeto1 = new class1();
  2. $objeto2 = new class2();
  3.  
  4. Registry::add('identificadorunico1', $objeto1);
  5. Registry::add('identificadorunico2', $objeto2);
  6.  
  7. // Aqui te retorna el $objeto1
  8. Registry::get('identificadorunico1');
  9.  
  10. // Aqui te retorna el $objeto2
  11. Registry::get('identificadorunico2');


Cita:
Iniciado por SetheR Ver Mensaje
2- ¿No hay una manera mas "transparente" de ultilizar el registro? Se me ocurrió usar la herencia pero no sé si será recomendable tener un clase abstracta que implemente el patrón y que las demás hereden de ella.
Sobre la herencia, no debes usarla por usarla. Debe haber una relacion de parentesco entre la clase padre e hija. Busca información en este foro al respecto.

Saludos.

Última edición por atrianaster; 25/11/2010 a las 09:47
  #7 (permalink)  
Antiguo 14/12/2010, 19:48
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 10 meses
Puntos: 44
Respuesta: Uso del patrón singleton y las sesiones

Cita:
Iniciado por atrianaster Ver Mensaje
cuando cambias de una página a otra todo lo que esta en el registro el garbage collector de php lo destruye. Puedes aprovechar el Registry solo por páguina.
Ésta es la parte por la que preguntaba. Sabiendo que tengo un único punto de entrada a mi aplicación.
1.¿Sería recomendable por ejemplo, tener una tabla con registros serializados o algo similar vinculadas con un SID y en cada request cargar todo otra vez?
2 ¿O sería un uso no adecuado para con los recursos?
Las sesiones las descarto por lo que dijo arriba GatorV

Yo lo que quiero es propagar cierta serie de objetos que pueden necesitar varias de mis clases, en cualquier punto de la aplicación de la forma más efectiva.

Saludos
  #8 (permalink)  
Antiguo 15/12/2010, 10:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Uso del patrón singleton y las sesiones

Para eso precisamente debes de usar un patrón Registry este te permite tener varias clases y poder leerlas desde cualquier parte de tu aplicación.

Saludos.
  #9 (permalink)  
Antiguo 15/12/2010, 10:27
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 10 meses
Puntos: 44
Respuesta: Uso del patrón singleton y las sesiones

Lo sé, por eso pregunto al respecto. El problema me surge al persistir el Registry durante toda la visita al sitio web, teniendo en cuenta el stateless de PHP.
  #10 (permalink)  
Antiguo 15/12/2010, 12:09
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Uso del patrón singleton y las sesiones

Cita:
Iniciado por SetheR Ver Mensaje
Lo sé, por eso pregunto al respecto. El problema me surge al persistir el Registry durante toda la visita al sitio web, teniendo en cuenta el stateless de PHP.
pero entonces ya estaría mal aplicado dicho patrón Registry, y en dado caso usar sesiones seria lo adecuado...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 15/12/2010, 16:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Uso del patrón singleton y las sesiones

Y en general no tiene caso que persistas los objetos si esto no es necesario, siempre es recomendable persitir los datos que sean necesarios para el identificar al usuario y el proceso, si sobrecargas la sesión con todos los objetos que usas pero que igual no son necesarios estas hablando de un mal diseño de tu aplicación.
  #12 (permalink)  
Antiguo 16/12/2010, 16:32
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 10 meses
Puntos: 44
Respuesta: Uso del patrón singleton y las sesiones

Entiendo, gracias.
Esta mañana he vuelto a leer sobre el tema y me ha quedado bastante más claro.

Necesitaba 2 objetos "ticket" que acompañaran al usuario durante su estancia en el sitio y no me parecia bien meterlo dentro de una sesión.

Así que implementé un clase Registry estática, al estilo de Zend y un patrón ActiveRecord al los tickets los cuales recupero fácilmente con un ID que sí guardo en la sesión.

Gracias por la ayuda!
  #13 (permalink)  
Antiguo 17/12/2010, 07:25
 
Fecha de Ingreso: diciembre-2010
Ubicación: Santiago, Chile
Mensajes: 16
Antigüedad: 13 años, 11 meses
Puntos: 3
Respuesta: Uso del patrón singleton y las sesiones

Aun cuando resulta mala idea esto se podría definiendo los métodos "mágicos" __sleep y __wakeup, que son usados en los procesos de serialización de clases.

Siendo __sleep el método para cerrar temporalmente la conexión y __wakeup para reconectar.

Etiquetas: sesiones, singleton
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:43.