2010-11-23 29 views
15

Soy bastante nuevo en la programación web, he utilizado principalmente Java para crear aplicaciones de escritorio en el pasado.persistencia de objetos en php

Estoy tratando de averiguar cómo crear objetos persistentes en php. Tal vez persistente no es la palabra correcta, no quiero que el objeto sea único para cada cliente, como lo obtendría al serializarlo en una variable de sesión. Quiero que el objeto se cree en el servidor y tener ese mismo objeto accesible en todo momento. El objeto consultaría la base de datos y almacenaría algunos datos. De esta forma, cada carga de página, el código php obtendría esa información del mismo objeto persistente en lugar de tener que consultar la base de datos cada vez.

Actualmente estoy usando el patrón de singleton para la creación de objetos porque mi comprensión inicial fue que me permitiría lograr lo que quiero. Parte del objeto es una matriz, y cuando ejecuto una página php que agrega un valor a la matriz y accedo a ese valor en la misma página, está bien. Sin embargo, cuando agrego un valor a la matriz y luego cargo otra página que accede al valor, la matriz vuelve a estar vacía.

¿Esto es posible? ¿Estoy reaccionando de forma exagerada al pensar que consultar tanto la base de datos es malo? En ocasiones habrá hasta 20 usuarios que soliciten datos durante un segundo, y me parece ridículo consultar el db cada vez.

Gracias

+2

20 solicitud de usuario por segundo no es mucho – Ben

+0

Aún más usuarios con más de 20 consultas por carga de página no son muchas. Ese no es el punto clave aquí. El problema principal es mantener la base de datos cuando cambian las estructuras de datos. – Tarion

Respuesta

9

Normalmente obtiene su persistencia mediante el uso de la base de datos. Si se trata de un cuello de botella, comienza a almacenar en caché los datos, por ejemplo, en memcached o tal vez un archivo local con una matriz serialized en su servidor web.

+2

Para consultas simples, que es más rápido, consulte una y otra vez la base de datos para los mismos datos, o ¿caché el objeto? Digamos que la consulta en sí misma toma 0.1 segundos. Por lo general, ¿cuál es el archivo más rápido + objeto serializado o base de datos + objeto-población? –

+0

Realmente no debería preocuparse por el rendimiento hasta que encuentre problemas reales con él. – Tarion

+5

Siempre debe preocuparse por el rendimiento. Podría ahorrar mucho tiempo aprenderlo de inmediato. Tuve que ajustar un proyecto hecho por otra persona una vez, que se hizo en PHP y tenía problemas de rendimiento. Me llevó mucho tiempo resolverlo. Más de lo que lo hubiera hecho de inmediato. –

13

PHP no tiene el concepto de persistencia de Java como lo hace: la JVM permite que las aplicaciones Java persisten en la memoria entre las peticiones HTTP; el servidor web crea un nuevo proceso PHP cada vez que se sirve una nueva solicitud HTTP para que las variables estáticas de un objeto no persistan datos entre las solicitudes.

Utilice una base de datos para almacenar datos persistentes. La programación web se centra en la concurrencia, por lo que no debe preocuparse por las consultas a la base de datos: 20 por segundo son pocas. Si alcanza los límites de su base de datos, tiene las opciones para agregar una capa de almacenamiento en caché o hardware de "escalamiento horizontal" al agregar esclavos de solo lectura.

0

La persistencia de los datos en la programación web se realiza mediante el uso de cookies/sesiones y la transmisión de cookies/variables de sesión a través de llamadas a páginas web. Teóricamente, cualquier clase de datos puede almacenarse en estas variables, pero para la mayoría de los propósitos prácticos, solo los datos más importantes (véanlos más como tokens) necesarios para identificar/reconstruir los objetos necesarios (con o sin una base de datos) se transfieren a y desde el servidor y el navegador.

0

Te aconsejo que eches un vistazo a memcached. Cuando habla de las capacidades de carga y rendimiento del servidor, una métrica útil suele ser páginas/segundo. Si tienes un servidor dedicado y cosas no optimizadas pero muy intensas, solo podrás publicar 5 páginas por segundo. Utilizar el almacenamiento en memoria caché de datos es una excelente manera de aumentar ese número de veces. Sin embargo, siempre es una compensación en cuanto a la caducidad de los datos. Realmente deberá probar su sitio para comprender (cuantificar) otros posibles factores que limitan el rendimiento, como otras conexiones por página (imágenes, css, etc.), archivo de E/S, otra actividad de la red y, por último, pero no menos importante, el real

+0

p.s memcahced admite servidores múltiples, y es una extensión muy bien probada y estable. La APC es excelente en un servidor y admite el uso personalizado, pero Memcached aún gana cuando se habla de una aplicación distribuida. Sin embargo, tendrá que hacer un trabajo interesante con incrementos como una lógica de "bloqueo", porque otra página podría haber modificado el valor para entonces. Dependiendo de memcached funcionará bien, pero tenga cuidado al codificar esta interfaz para que no suponga que no ha cambiado y sobrescribir los datos más nuevos. http://www.php.net/manual/en/memcache.increment.php – zanlok

0

Deje de usar singleton y use la inyección de dependencia.

La mejor manera es usar DataMapper (http://www.martinfowler.com/eaaCatalog/dataMapper.html) y adjuntarlo a un objeto mediante propiedades dinámicas. Permita que el mapeador de datos maneje la persistencia.

$CS = new CookieStorage(); 
$SS = new SessionStorage(); 
$FS = new FileStorage('config/object.db'); 

$DM = new ObjectDataMapper($FS); 

$O = new Object($DM); 

$Object->DynamicProperty = 1; 

Ahora DynamicProperty persistirá de forma automática y se cargará automáticamente desde el archivo object.db. Y la definición de clase:

class Object 
{ 
    public function __construct(MapperInstance $Storage = NULL) 
    { 
     $this->setMapper($Storage?: new ObjectDataMapper(new FileStorage('config/object.db'))); 
    } 

    public function __get($name) 
    { 
     $this->_Mapper->getProperty($name); 
    } 

    public function __isset($name) 
    { 
     $this->_Mapper->isProperty($name); 
    } 

    public function __set($name, $value) 
    { 
     $this->Mapper->setProperty($name, $value); 
    } 
} 
0

Es posible almacenar objetos en la sesión actual. Ahora solo crea una clase base que pueda almacenar y recrear el objeto mismo. Cualquier objeto derivado también será persistente.

Es posible que desee leer aquí: persistent base class and example

Por lo que yo sé la sesión se almacena en la memoria RAM y por lo tanto debe ser más rápido que serializar los objetos en el disco para lograr la persistencia.

+0

El enlace a esta página no está disponible. – Blip

+0

Gracias. Acabo de actualizar el enlace :) – tswaehn

1

Aunque puede que no sea la solución más bonita, pero puede usar SESIONES para este asunto.

class SomeObject{ 

    public function __costructor{ 
     $_SESSION['object'] = serialize($this); 
    } 

} 

y en otra página, se puede llamar al objeto simplemente con:

$object = unserialize($_SESSION['object']); 

Aunque por supuesto, este enfoque parece la más fácil. Debe venir con la máxima precaución:

  1. Saber que las sesiones dependiendo del tráfico de su servidor no debe ser demasiado grande en tamaño que muchos usuarios al mismo tiempo piden para cada una de estas sesiones. Escala el tamaño según tu propio criterio.

  2. siempre serializar y deserializar como sesiones no hechas, así se portarán mal.

Lo que alguna vez navega su barco. Hazlo en tu propio análisis consciente. goodluck