私は "良いコード"を書いて、クラスのコンストラクタでデータベースオブジェクトを渡すために依存関係注入を使用しようとしています。PHPのMongoDBオブジェクトをキャッシュする
コンストラクタは、一般的にこの形式を取っている:
public function __construct(MongoDB $db) {
$this->collection = $db->collectionName;
}
私が作成した各オブジェクトに対して、新しいMongoCollection
が作成されたことに気付きました。オブジェクトが自分自身をCRUDすることができるように私は、ActiveRecordのスタイルのベースクラスを使用してきた(すなわち、二度二つの別個のオブジェクトではなく、同じオブジェクトを返します$db->collectionName
プロパティにアクセス)
。
私は何らかの種類のgetAllRecords()
関数を使用し、100sのこれらのオブジェクトを返すと、100個のMongoCollection
オブジェクトが作成されます。 (ドライバのソースをざっと見はPHPで新しい表現だけではなく、新しいオブジェクトがあまりにもそこに作成していることを示しているようだ)
私はキャッシュを実装するために、両方のMongo
とMongoDB
クラスをラップすることにより、この問題を回避得ています。次のように
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の)
おかげで、
リー。
ありがとう@クリスティーナ、私はwまたはwtimeoutにする必要がある変更は、すべてのコレクションで同じであると思いますので、私が気にするコレクションの名前にしか見えません。データオブジェクトをどのように管理するのか尋ねてもいいですか? ActiveRecord、DataMapperなどを使用していますか? – Leigh
私はドライバーを書いたので、私の知識はほとんど理論的です:)より実践的な経験を持つユーザーはおそらくあなたの質問の第3の部分に答える資格があります。 – kristina
あなたはドライバーを書いたことが分かりましたので、私はあなたを嫌っています;) - しかし、あなたの時間はTYですが、PHPチャットでMongoを使う人がいることは知っています。 – Leigh