У меня возникла проблема с утечкой памяти в сценарии 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();
Из того, что я узнал ранее, это оставляет некоторую память просочившейся.
Итак, мой вопрос: что я здесь не так делаю? почему эта утечка памяти и как мне действительно закрыть / воссоздать менеджер сущностей?