Как правильно закрыть Entity Manager в доктрине - PullRequest
7 голосов
/ 08 октября 2011

У меня возникла проблема с утечкой памяти в сценарии 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();

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

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

Ответы [ 2 ]

9 голосов
/ 24 февраля 2012

Вы пробовали:

$this->em->getConnection()->getConfiguration()->setSQLLogger(null);

Я читал, что это отключает регистратор SQL, который не очищается и иногда вызывает утечки памяти, как у вас.

2 голосов
/ 08 октября 2011

Вы пробовали использовать метод очистки вместо закрытия?

Надеюсь, это поможет вам ---> Пакетная обработка

...