2012-03-29 81 views
6

我一直在努力編寫「良好的代碼」,並使用依賴注入在我的類的構造函數中傳遞數據庫對象。在PHP中緩存MongoDB對象

構造一般都採取這種形式:

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

我注意到,每個對象創建的,創建一個新的MongoCollection。 (即訪問$db->collectionName屬性兩次返回兩個不同的對象,不相同的對象)

我已經使用一個ActiveRecord樣式基類,使得對象能夠CRUD自己。

現在當我使用某種getAllRecords()函數,並返回100s這些對象時,會創建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本身的bug /功能(是否需要2個對象用於同一個集合?)
  • 我會爲我自己通過緩存創建的對象MongoDBMongoCollection,並重新使用它們。
  • 其他人通常如何處理MongoDB的工作?我應該完全使用不同的方法嗎? (即DataMapper的)

謝謝,

利。

回答

2

這是故意的,因爲集合具有與它們的名稱不同的屬性(w和wtimeout此刻,更多計劃未來)。如果你關心的只是名字,那麼緩存它們就可以了。

+0

感謝@kristina,我認爲對w或wtimeout所做的任何更改在所有集合中都是相同的,因此它似乎只是我關心的集合的名稱。我可以問你通常如何管理你的數據對象嗎?你使用ActiveRecord,DataMapper,還是其他的東西,或者只是看起來最適合的東西? – Leigh 2012-03-29 18:33:19

+0

我寫的驅動程序,所以我的知識主要是理論:)具有更多實踐經驗的用戶可能更好地回答你的問題的第三部分。 – kristina 2012-03-29 19:12:48

+0

我知道你寫了驅動程序,這就是爲什麼我會纏着你;) - 但是TY爲你的時間,我知道在PHP聊天中有一些人使用Mongo,我會去弄錯它們。 – Leigh 2012-03-29 19:15:57

1

我一直在將MongoCollection傳入我的對象而不是MongoDb。我的推理是選擇對象中的集合將是一個隱藏的依賴(可能是矯枉過正),然後在我的單元測試中,我可以嘲笑MongoCollection對象。

+0

我的構造函數實際上有'parent :: __構造($ db-> collection)'。*我的推理*是一個對象很好,知道它自己的集合是什麼,我不想跟蹤對象之外的100個集合。 – Leigh 2012-03-29 18:26:54