我在Doctrine2脚本中遇到了内存泄漏问题,这个问题原本是由一段应该消除内存问题的代码造成的。如何在doctrine中正确关闭实体管理器
我知道之前,你可以(也应该)清除实体管理器,每20次迭代我做了以下内容:
if ($this->usersCalculated % 20 == 0) {
$this->em->close();
$this->em = \Bootstrap::createEm();
$this->loadRepositories();
}
和自举:: createEm看起来是这样的:
public static function createEm() {
$em = EntityManager::create(Bootstrap::$connectionOptions, Bootstrap::$config);
$em->getConnection()->setCharset('utf8');
return $em;
}
我首先重新创建实体管理器的原因是因为我的UnitOfWork变得疯狂,我不知道$ em-> clear()方法。因此,即使我目前的内存泄漏似乎在目前解决(或至少减少),我仍然必须创建一个新的实体管理器,每当我需要做一个单独的插入/更新查询而不依赖于别人做冲洗。例如,每当我发邮件,我在数据库中插入一行来表示的话,并且代码看起来是这样的:
$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();
从我从以前学过,留下一些内存泄露的背后。
所以我的问题是,我在这里做错了什么?为什么这是泄漏的内存,我应该如何真正关闭/重新创建一个实体管理器?
@Cristian_Douce正如我在问题中所说,我的内存泄漏问题是在我使用clear而不是重新创建后解决的。但是这个问题仍然有效,因为我有其他需要创建和销毁时间的脚本部分。 –
关闭它之前要清除什么? –
@Cristian_Douce我正在清理它,然后关闭它。我已经阅读关闭函数的学说代码,它所做的只是调用清除并将其标记为关闭。必须有一些静态属性或持久对象持有对em的引用,否则垃圾回收器将释放它。 –