2012-03-29 33 views
6

私は "良いコード"を書いて、クラスのコンストラクタでデータベースオブジェクトを渡すために依存関係注入を使用しようとしています。PHPのMongoDBオブジェクトをキャッシュする

コンストラクタは、一般的にこの形式を取っている:

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

私が作成した各オブジェクトに対して、新しいMongoCollectionが作成されたことに気付きました。オブジェクトが自分自身をCRUDすることができるように私は、ActiveRecordのスタイルのベースクラスを使用してきた(すなわち、二度二つの別個のオブジェクトではなく、同じオブジェクトを返します$db->collectionNameプロパティにアクセス)

私は何らかの種類の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自体のバグ/機能ですか(同じコレクションに2つのオブジェクトが必要なユースケースはありますか)。
  • 問題が発生しますか?作成されたオブジェクトのいずれか、または両方をキャッシュして再利用することで解決できます。
  • 他の人がMongoDBの操作をどのように扱うのですか?私は全く別のアプローチを使用するべきですか? (すなわち、DataMapperの)

おかげで、

リー。

答えて

2

コレクションには、名前に関連付けられた名前以外のプロパティが含まれているため、意図的です(wおよびwtimeoutの現時点では、今後の予定です)。あなたが気にするものがすべて名前であれば、それをキャッシュするのもいいです。

+0

ありがとう@クリスティーナ、私はwまたはwtimeoutにする必要がある変更は、すべてのコレクションで同じであると思いますので、私が気にするコレクションの名前にしか見えません。データオブジェクトをどのように管理するのか尋ねてもいいですか? ActiveRecord、DataMapperなどを使用していますか? – Leigh

+0

私はドライバーを書いたので、私の知識はほとんど理論的です:)より実践的な経験を持つユーザーはおそらくあなたの質問の第3の部分に答える資格があります。 – kristina

+0

あなたはドライバーを書いたことが分かりましたので、私はあなたを嫌っています;) - しかし、あなたの時間はTYですが、PHPチャットでMongoを使う人がいることは知っています。 – Leigh

1

MongoDbの代わりにMongoCollectionをオブジェクトに渡しています。私の推論は、オブジェクト内のコレクションを選択することは隠された依存関係(過度かもしれません)であり、私の単体テストではMongoCollectionオブジェクトをモックできます。

+0

私のコンストラクタは実際には 'parent :: __ construct($ db-> collection)'を持っています。*私の推論*は、オブジェクトがそれ自身のコレクションが何であるかを知っていて、オブジェクトの外側に100個ものコレクションを追跡したくないということでした。 – Leigh

関連する問題