gpt4 book ai didi

php - 在 PHP 中缓存 MongoDB 对象

转载 作者:IT老高 更新时间:2023-10-28 13:29:19 24 4
gpt4 key购买 nike

我一直在尝试编写“好代码”并使用依赖注入(inject)在我的类的构造函数中传递数据库对象。

构造函数一般采用这种形式:

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

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

我一直在使用 ActiveRecord 风格的基类,以便对象能够自己进行 CRUD。

现在,当我使用某种 getAllRecords() 函数并返回 100 个这些对象时,会创建 100 个 MongoCollection 对象。 (快速查看驱动源似乎表明那里也创建了新对象,而不仅仅是 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);
}
}

我的问题如下:

  • 这是 MongoDB 的预期行为吗?它真的应该每次都返回一个新对象,还是 PHP 驱动程序或 Mongo 本身的错误/功能(是否存在需要 2 个对象用于同一个集合的用例?)
  • 我是否会通过缓存创建的 MongoDBMongoCollection 对象中的一个/两个并重用它们来给自己带来问题。
  • 其他人通常如何处理使用 MongoDB 的工作?我应该完全使用不同的方法吗? (即 DataMapper)

谢谢,

利。

最佳答案

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

关于php - 在 PHP 中缓存 MongoDB 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9927316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com