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

Mantener objeto entre diferentes visitas

Estas en el tema de Mantener objeto entre diferentes visitas en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Muy buenas! No sé exactamente cómo enfocar este problema. El tema es que, un cierto script .php crea un objeto "costoso" (realiza un proceso costoso ...
  #1 (permalink)  
Antiguo 09/09/2008, 16:21
Avatar de peaso  
Fecha de Ingreso: enero-2002
Ubicación: Barcelona
Mensajes: 147
Antigüedad: 22 años, 3 meses
Puntos: 0
Pregunta Mantener objeto entre diferentes visitas

Muy buenas!

No sé exactamente cómo enfocar este problema. El tema es que, un cierto script .php crea un objeto "costoso" (realiza un proceso costoso de autentificación sobre un servidor externo). Si otro usuario visita ese script, volverá a crear el mismo objeto.

¿Cómo podría aprovechar el objeto creado por el login del primer visitante para el segundo?

Si ese objeto fuera una variable "normal", la almacenaría en la base de datos y listos. Pero es un objeto más complejo.

¿Alguna idea?
  #2 (permalink)  
Antiguo 09/09/2008, 18:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Mantener objeto entre diferentes visitas

Hola peaso,

Lamentablemente no puedes compartir un objeto entre visitantes de esa manera, PHP no fue diseñado de esa manera y cada "visita" que tengas creara una nueva instancia del objeto.

Saludos.
  #3 (permalink)  
Antiguo 09/09/2008, 20:00
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Respuesta: Mantener objeto entre diferentes visitas

Dependiendo de la complejidad que tenga el "estado" de este objeto (más allá de la compejidad o costo que implique crear ese "estado"), tal vez puedas guardarlo en la base de datos.

Entiendo que php permite serializar objetos, y de hecho es lo que pasa si guardás un objeto en una variable de sesión. Todos los datos se serializan y se guardan (los métodos, no); cuando se recupera ese objeto, se lo vuelve a crear (deserializando los datos previamente serializados). Si no hay de por medio referencias a recursos (como conexiones a bases de datos, archivos abiertos, etc), creo que en principio sería factible (la parte de los recursos no funciona porque cuando creás una conexión a una base de datos, por ejemplo, lo que guardás es una referencia a un recurso que se crea para ese script y al terminar su ejecución se destruye; esta referencia no es válida para otros scripts).

Más sobre este tema:
http://ar.php.net/manual/es/function.serialize.php
http://ar.php.net/manual/es/language...ialization.php

Una opción que se me ocurre podría ser tener una clase que maneje a este objeto, con un método getInstance() (como si fuera una especie de Singleton), que devolvería el objeto "costoso". Este método podría consultar si hay algún objeto "costoso" válido en la base de datos (tomando por válido cualquier objeto de menos de 24 hs de antigüedad, por ejemplo). En caso de haberlo, tomar esos datos para crear el nuevo objeto. En caso contrario, usar el método "costoso" de este objeto, obtener los datos y guardarlo en la base para la próxima vez.

Algo así (a grandes rasgos):

Código PHP:
class ManagerObjetoCostoso {
    
    private 
$objetoCostoso;
    
    public function 
getInstance() {
        
$datosSerializados $this->getFromDateBase();
        
        if(
$datosSerializados == NULL) {
            
$this->objetoCostoso = new ObjetoCostoso();
            
$this->objetoCostoso->obtenerDatos();
            
$this->saveToDataBase($this->objetoCostoso);
            
        } else {
            
            
$this->objetoCostoso unserialize($datosSerializados);
        
        }
        
        return 
$this->objetoCostoso;
    }
    
    private function 
saveToDataBase($obj) {
        
$datosSerializados serialize($obj);
        
//  guardar los datos en la base para la próxima consulta...
    
}
    
    private function 
getFromDateBase() {
        
//  hace un select de la base y devuelve los datos guardados si son válidos
        //  si no encuentra datos válidos, devuelve NULL
    
}
}

//
//  USO
//
$mgr = new ManagerObjetoCostoso();
$obj $mgr->getInstance(); 
Saludos
Juan Pablo Califano
  #4 (permalink)  
Antiguo 09/09/2008, 21:27
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Mantener objeto entre diferentes visitas

Cita:
No sé exactamente cómo enfocar este problema. El tema es que, un cierto script .php crea un objeto "costoso" (realiza un proceso costoso de autentificación sobre un servidor externo). Si otro usuario visita ese script, volverá a crear el mismo objeto.
¿Mmm.. pero lo "costoso" qué es? ¿Puedes definirlo mejor?

Si es un proceso de autenticación, está bien que cada vez que ingrese el usuario vuelva a necesitarlo.

Cita:
¿Cómo podría aprovechar el objeto creado por el login del primer visitante para el segundo?
¿Qué parte del objeto? ¿No será que el objeto es muy grande y que no necesariamente lo necesites completo por cada usuario?

Cita:
Si ese objeto fuera una variable "normal", la almacenaría en la base de datos y listos. Pero es un objeto más complejo.
Nada es lo suficiente complicado como para que sea "complejo" persistir.

Perfectamente puedes persistir toda la información del objeto.

Lo otro que se puede haces es un Patrón Proxy, donde solo levantas lo que necesitas, pero nuevamente, me falta información.

Cita:
¿Alguna idea?
Muchas.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #5 (permalink)  
Antiguo 09/09/2008, 23:24
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años
Puntos: 37
Respuesta: Mantener objeto entre diferentes visitas

Lo que almacenas son las propiedades del objeto.

En ese caso lo que podes hacer es serializar el objeto.

Lo guardas en la base, o en un file, y listo el pollo
__________________
blog
  #6 (permalink)  
Antiguo 10/09/2008, 03:28
Avatar de anlhp  
Fecha de Ingreso: agosto-2008
Mensajes: 121
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Mantener objeto entre diferentes visitas

creo que califa.. fue el primero en dar en el clavo, aunque en realidad me carcome la curiosidad de qué diablos es ese objeto que lo hace tran monstruoso jeje, y ademas sea valido para cualquier usuario pero volviendo al tema, existen dos metedos magicos especialmente utiles para casos como estos:
__sleep()
__wakeup()
estos se invocan antes y despues de serializar y un-serializar un objeto, y son muy utiles para el tema de guardar y restablecer propiedades de tu objeto, metele un poco de coco al tema, claro, igual tienes que utilzar serialize y toda esa vuelta, pero bueno, ...
no obstante te aconsejo - que tal si intentas buscar una solucion alternativa a lo que quieres hacer, no se tu, pero yo confio ciegamente en los tios de php, y si no me dan la alternativa de compartir ese objeto como quieres, es porque te dan una solucion mas eficiente, recuerda que significa eficiencia:
-dar más, con menos.... ;)
  #7 (permalink)  
Antiguo 10/09/2008, 17:52
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Mantener objeto entre diferentes visitas

Voto por serializar el objeto y guardarlo en algún repositorio de datos (sea un archivo o una base de datos)
__________________
Blog | Tecnosquad
  #8 (permalink)  
Antiguo 16/09/2008, 07:06
Avatar de peaso  
Fecha de Ingreso: enero-2002
Ubicación: Barcelona
Mensajes: 147
Antigüedad: 22 años, 3 meses
Puntos: 0
De acuerdo Respuesta: Mantener objeto entre diferentes visitas

Antes de nada, agradeceros enormemente vuestra desinteresada ayuda. No me cansaré de decirlo: sois los mejores!

A las dudas: el objeto no es costoso por su tamaño, sino por el proceso de crearlo. Se trata de una identificación genérica sobre un servidor externo al mío, que hay que realizar el mínimo número posible de ocasiones.

Efectivamente, creo que la respuesta más acertada es la de califa: a pesar de ser un objeto de creación "costosa", es más bien pequeño, por lo que es perfectamente insertable en una base de datos su forma serializada.

Eso es lo que he hecho. Cuando se necesita el objeto, se comprueba si existe en la base de datos. Si sigue siendo activo, lo "unserializo" y lo utilizo. Si no, lo creo, lo "serializo" y lo guardo en la bbdd.

El único problema que podría haber es que dos usuarios diferentes creen "a la vez" cada uno su objeto. El segundo objeto creado machacaría al primero en la base de datos pero, como ambos son perfectamente válidos para cualquier tipo de visitante, el problema es menor: solo se habría creado inutilmente uno de los objetos.

Lo dicho, muchas gracias a todos.
  #9 (permalink)  
Antiguo 16/09/2008, 08:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Mantener objeto entre diferentes visitas

Recuerda que si en tu objeto existen "recursos", como apuntadores a archivos, conexiones a servidores, o a bases de datos, estos no se pueden serializar y se cerraran tan pronto se destruya el objeto (al finalizar el script).

Los unicos datos serializables son variables normales, como arreglos, numeros, cadenas, etc.

Saludos
  #10 (permalink)  
Antiguo 16/09/2008, 08:37
Avatar de peaso  
Fecha de Ingreso: enero-2002
Ubicación: Barcelona
Mensajes: 147
Antigüedad: 22 años, 3 meses
Puntos: 0
Respuesta: Mantener objeto entre diferentes visitas

Buen apunte. No tengo ningún problema con eso: como dices, todos los datos del objeto son variables "normales" (numéricas o textuales).
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 03:51.