在PHP中缓存MongoDB对象

Lei*_*igh 6 php caching mongodb

我一直在尝试编写"好代码"并使用依赖注入来传递我的类的构造函数中的数据库对象.

构造函数通常采用以下形式:

public function __construct(MongoDB $db) {
    $this->collection = $db->collectionName;
}
Run Code Online (Sandbox Code Playgroud)

我注意到,对于创建的每个对象,都会创建一个 对象MongoCollection.(即访问 $db->collectionName 属性两次返回两个不同的对象,而不是同一个对象)

我一直在使用ActiveRecord样式基类,因此对象可以自己CRUD.

现在,当我使用某种getAllRecords()功能,并返回100个这些对象时,MongoCollection会创建100个对象.(快速查看驱动程序源似乎表明在那里也创建了新对象,而不仅仅是PHP中的新表示)

我通过包装两个类MongoMongoDB类来实现缓存,从而解决了这个问题.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  • 这是MongoDB的预期行为吗?它应该每次真的返回一个新对象,还是PHP驱动程序或Mongo本身的bug /功能(是否有一个用例需要同一个集合的2个对象?)
  • 我是否会通过缓存创建的对象MongoDB和/ 或MongoCollection对象以及重新使用它们来为自己造成问题.
  • 其他人通常如何处理MongoDB?我应该完全使用不同的方法吗?(即DataMapper)

谢谢,

利.

kri*_*ina 2

这是有意为之的,因为集合除了与它们相关的名称之外还有其他属性(目前是 w 和 wtimeout,未来有更多计划)。如果您只关心名称,那么缓存它们就可以了。