Кеширование объектов MongoDB в PHP - PullRequest
6 голосов
/ 29 марта 2012

Я пытался написать «хороший код» и использовать внедрение зависимостей для передачи объектов базы данных в конструкторы моих классов.

Обычно конструкторы принимают следующую форму:

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

Я заметил, что для каждого созданного объекта создается новый MongoCollection.(т.е. доступ к свойству $db->collectionName дважды возвращает два разных объекта, а не один и тот же объект)

Я использовал базовый класс стиля ActiveRecord, так что объекты могут сами CRUD.

Теперь, когда я использую какую-то функцию getAllRecords() и возвращаю сотни этих объектов, создаются сотни объектов MongoCollection.(Беглый взгляд на источник драйвера, похоже, указывает на то, что там тоже создаются новые объекты, а не только новые представления в PHP)кеширование.

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 (есть ли вариант использования для двух объектов для одной коллекции?)
  • Смогу ли явызывать проблемы для себя, кэшируя либо / оба MongoDB и MongoCollection создаваемые объекты, и используя их повторно.
  • Как другие люди обычно справляются с работой с MongoDB?Должен ли я использовать другой подход полностью?(Т. Е. DataMapper)

Спасибо,

Ли.

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Это преднамеренно, поскольку коллекции имеют свойства, отличные от их имен, связанных с ними (w и wtimeout на данный момент, более запланированные на будущее). Если все, что вас волнует, это имена, тогда их можно кешировать.

1 голос
/ 29 марта 2012

Я передаю MongoCollection в мои объекты вместо MongoDb. Мое рассуждение состояло в том, что выбор коллекции в объекте будет скрытой зависимостью (может быть, чрезмерной), и затем в моих модульных тестах я могу высмеивать объект MongoCollection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...