Ich habe versucht, "guten Code" zu schreiben und Dependency Injection zu verwenden, um Datenbankobjekte in den Konstruktoren meiner Klassen zu übergeben.Caching von MongoDB-Objekten in PHP
Konstrukteurs nehmen im Allgemeinen die folgende Form:
public function __construct(MongoDB $db) {
$this->collection = $db->collectionName;
}
Ich habe bemerkt, dass für jedes Objekt erstellt, ein neueMongoCollection
erstellt wird. (Das heißt den Zugriff auf den $db->collectionName
Eigenschaft zweimal gibt zwei verschiedene Objekte, nicht das gleiche Objekt)
Ich habe eine Active Stil Basisklasse wurde unter Verwendung, so dass Objekte sind in der Lage, sich selbst CRUD.
Jetzt, wenn ich eine Art von getAllRecords()
Funktion verwende, und 100s dieser Objekte zurückgeben, werden 100s MongoCollection
Objekte erstellt. (Ein kurzer Blick auf die Treiberquelle scheint darauf hinzuweisen, dass auch dort neue Objekte erstellt werden, nicht nur neue Darstellungen in PHP)
Ich habe das erreicht, indem ich sowohl Mongo
als auch MongoDB
Klassen implementiert habe, um Caching zu implementieren.
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);
}
}
Meine Fragen sind wie folgt:
- dieses Verhalten von MongoDB gedacht? Sollte es wirklich jedes Mal ein neues Objekt zurückgeben, oder ist es ein Bug/Feature im PHP Treiber oder Mongo selbst (gibt es einen Anwendungsfall für 2 Objekte für die gleiche Sammlung?)
- Werde ich Probleme verursachen Ich selbst, indem Sie entweder
MongoDB
undMongoCollection
Objekte, die erstellt werden, und sie wiederverwenden. - Wie gehen andere Personen normalerweise mit MongoDB um? Sollte ich einen völlig anderen Ansatz verwenden? (D DataMapper)
Danke,
Leigh.
Danke @kristina, ich denke, dass alle Änderungen, die ich an w oder wtimeout vornehmen müsste, über alle Sammlungen hinweg gleich sein würden, daher scheint es nur der Name der Sammlung zu sein, die mir wichtig ist. Darf ich fragen, wie Sie Ihre Datenobjekte normalerweise verwalten? Verwenden Sie ActiveRecord, DataMapper, etwas anderes oder einfach nur das, was am besten passt? – Leigh
Ich habe den Treiber geschrieben, daher ist mein Wissen meist theoretisch. Benutzer mit mehr praktischer Erfahrung sind wahrscheinlich besser qualifiziert, den dritten Teil Ihrer Frage zu beantworten. – kristina
Ich weiß, dass du den Treiber geschrieben hast, deshalb belästige ich dich;) - Aber TY für deine Zeit, ich weiß, es gibt ein paar Leute im PHP-Chat, die Mongo benutzen, ich werde sie gehen lassen. – Leigh