此代码在trollService.php(Symfony 2.3)中:
public function trolling()
{
$repository = $this->entityManager->getRepository('TrollBundle:Troll');
$trolls = $repository->findAll(); //memory leak
return memory_get_usage();
}
...
//somewhere:
while(1)
{
$result = $trollService->trolling();
}
N次迭代的$结果始终是> N-1次迭代。这怎么可能?是不是$ trolls变量一个局部变量,从函数返回后应该自动删除? O.o
那么,如何在下一次迭代之前清除内存?
答案 0 :(得分:2)
Doctrine保留在内存中已经取出的对象:是一种避免过多db查询的方法。
此机制称为 身份地图
这称为“身份地图”模式,这意味着Doctrine保持一个 每个实体的映射和每个PHP请求检索的ID 并不断给你返回相同的实例。
还要记住,默认情况下,SQL连接的日志记录设置为
kernel.debug
的值,所以如果你有idebug设置为true的话 每次迭代都会将每个SQL命令存储在内存中。
如果你想清除记忆,你必须使用$this->entityManager->clear();
作为trolling()
功能的最后一条指令
public function trolling()
{
$repository = $this->entityManager->getRepository('TrollBundle:Troll');
$trolls = $repository->findAll(); //memory leak
$this->entityManager->clear(); //here
return memory_get_usage();
}