2012-03-29 21 views
6

He intentado escribir "buen código" y uso la inyección de dependencia para pasar objetos de base de datos en los constructores de mis clases.Almacenamiento en caché de objetos MongoDB en PHP

Los constructores son generalmente tomando este formulario:

public function __construct(MongoDB $db) { 
    $this->collection = $db->collectionName; 
} 

me he dado cuenta de que para cada objeto creado, se crea una nueva MongoCollection. (Es decir, el acceso a la propiedad $db->collectionName devuelve dos veces dos objetos distintos, no el mismo objeto)

He estado usando una clase base estilo ActiveRecord, por lo que los objetos son capaces de crud sí mismos.

Ahora cuando uso algún tipo de función getAllRecords() y devuelvo 100 de estos objetos, se crean 100s de objetos MongoCollection. (Una mirada rápida a la fuente del controlador parece indicar que también se crean nuevos objetos, no solo nuevas representaciones en PHP)

He evitado esto al incluir las clases Mongo y MongoDB para implementar el almacenamiento en caché.

class MyMongo extends Mongo 
{ 
    private $objectCache = array(); 

    public function __get($name) { 
     return array_key_exists($name, $this->objectCache) 
      ? $this->objectCache[$name] 
      : $this->objectCache[$name] = new MyMongoDB($this, $name); 
    } 
} 

class MyMongoDB extends MongoDB 
{ 
    private $objectCache = array(); 

    public function __get($name) { 
     return array_key_exists($name, $this->objectCache) 
      ? $this->objectCache[$name] 
      : $this->objectCache[$name] = new MongoCollection($this, $name); 
    } 
} 

Mis preguntas son las siguientes:

  • ¿Es este comportamiento de MongoDB pretende? ¿Debería devolver un objeto nuevo cada vez, o es un error/función en el controlador PHP o Mongo mismo (hay un caso de uso para necesitar 2 objetos para la misma colección?)
  • ¿Voy a causar problemas para yo mismo al almacenar en caché cualquiera/ambos MongoDB y MongoCollection objetos que se crean y los vuelvo a usar.
  • ¿Qué otras personas suelen manejar trabajando con MongoDB? ¿Debería usar un enfoque diferente por completo? (Es decir DataMapper)

Gracias,

Leigh.

Respuesta

2

Es intencional, ya que las colecciones tienen propiedades distintas a sus nombres asociados (w y wtimeout en este momento, más planeados para el futuro). Si todo lo que te interesa son los nombres, entonces está bien guardarlos en la memoria caché.

+0

Gracias @kristina, creo que cualquier cambio que tenga que hacer para w o wtimeout sería el mismo en todas las colecciones, por lo que parece ser el nombre de la colección que me importa. ¿Puedo preguntar cómo gestionas normalmente tus objetos de datos? ¿Usas ActiveRecord, DataMapper, algo más o simplemente lo que parece encajar mejor? – Leigh

+0

Escribí el controlador, por lo que mi conocimiento es principalmente teórico :) Los usuarios con más experiencia práctica probablemente estén mejor calificados para responder la tercera parte de su pregunta. – kristina

+0

Sé que usted escribió el controlador, es por eso que lo estoy molestando;) - Pero TY para su tiempo, sé que hay algunos tipos en el chat de PHP que usan Mongo, iré y los molestaré. – Leigh

1

He pasado el MongoCollection en mis objetos en lugar de MongoDb. Mi razonamiento fue que la elección de la colección en el objeto sería una dependencia oculta (puede ser excesiva) y luego en mis pruebas de unidad, puedo simular el objeto MongoCollection.

+0

Mis constructores realmente tienen 'parent :: __ construct ($ db-> collection)' en ellos.* Mi razonamiento * fue que un objeto está bien sabiendo cuál es su propia colección, y no quería tener que hacer un seguimiento de cientos de colecciones fuera del objeto. – Leigh

Cuestiones relacionadas