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
yMongoCollection
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.
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
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
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