Как правильно закрыть Entity Manager в доктрине

У меня была проблема с утечкой памяти в сценарии Doctrine2, которая, очевидно, была вызвана фрагментом кода, который должен был устранить проблемы с памятью.

Прежде чем я узнал, что вы можете (и должны) очистить Entity Manager, каждые 20 итераций я делал следующее:

if ($this->usersCalculated % 20 == 0) {
   $this->em->close();
   $this->em = \Bootstrap::createEm();
   $this->loadRepositories();
}

И Bootstrap :: createEm выглядит так:

public static function createEm() {
    $em = EntityManager::create(Bootstrap::$connectionOptions, Bootstrap::$config);
    $em->getConnection()->setCharset('utf8');
    return $em;
}

Причина, по которой я воссоздал Entity Manager в во-первых, потому что мой UnitOfWork разрастался, а я ничего не знал о методе $ em-> clear ().

Итак, даже если моя текущая утечка памяти кажется решенной на данный момент (или, по крайней мере, уменьшена), мне все равно придется создавать новый Entity Manager всякий раз, когда мне нужно выполнить отдельный запрос вставки / обновления, не полагаясь на то, что кто-то другой сделает румянец. Например, всякий раз, когда я отправляю электронное письмо, я вставляю строку в базу данных, чтобы указать это, и код выглядит следующим образом:

    $emailSent = new \model\EmailSent();
    $emailSent->setStuff();
    // I do it in a new em to not affect whatever currentunit was doing.
    $newEm = \Bootstrap::createEm();
    $newEm->persist($emailSent);
    $newEm->flush();
    $newEm->close();

Из того, что я узнал ранее, это оставляет некоторую утечку памяти.

Итак, мой вопрос: что я здесь делаю не так? почему эта утечка памяти и как мне действительно закрыть / воссоздать диспетчер сущностей?

7
задан hakre 10 July 2012 в 14:25
поделиться