symfony存储库内存泄漏

时间:2014-06-27 06:57:05

标签: symfony memory

此代码在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

那么,如何在下一次迭代之前清除内存?

1 个答案:

答案 0 :(得分:2)

Doctrine保留在内存中已经取出的对象:是一种避免过多db查询的方法。

此机制称为 身份地图

  

这称为“身份地图”模式,这意味着Doctrine保持一个   每个实体的映射和每个PHP请求检索的ID   并不断给你返回相同的实例。

     

还要记住,默认情况下,SQL连接的日志记录设置为   kernel.debug的值,所以如果你有idebug设置为true的话   每次迭代都会将每个SQL命令存储在内存中。

(来自doctrine2 documentation

如果你想清除记忆,你必须使用$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();
}