教义-使用namedQuery执行时发生内存泄漏?

时间:2019-03-09 09:43:03

标签: php mysql symfony doctrine-orm doctrine

在我的项目中,我正在使用symfony 3.4和理论。在我为用户生成排名的命令之一中,使用namedQuery时遇到了潜在的内存泄漏(尽管我可能错了)。

在每次循环迭代中(超过2000条记录),我都在运行EntityManager->clear()方法和gc_collect_cycles()(只是为了确保正确的垃圾收集)。尽管10000次迭代后的内存使用量跃升至500mB左右,但这确实很奇怪,因为它在使用queryBuilder构成查询的其他命令中正常工作。

我确保没有其他代码对此内存问题负责,并将执行提取为获取结果并运行命名查询。

我也尝试在实体管理器配置中禁用sql logger,但这没有帮助。任何人都知道有什么问题吗?

NamedQuery

SELECT SUM(a.points) FROM __CLASS__ a WHERE a.user = :user GROUP BY a.user

代码中有问题的部分(最大约500MB):

$query = $this->createNamedQuery('count_points');
$query->setParameter('user', $user->getId());
$query->setCacheable(false);

return $query->getSingleScalarResult();

无内存泄漏的解决方案(最大〜60-70MB):

$query = $this->createNamedQuery('count_points');
$query->setParameter('user', $user->getId());
$query->setCacheable(false);

// bypass named query execution through doctrine for memory saving
$sql = $query->getSQL();
$conn = $this->getEntityManager()->getConnection();
$stmt = $conn->prepare($sql);
$stmt->execute([$user->getId()]);
unset($query);

return (int)$stmt->fetch(\PDO::FETCH_COLUMN);

1 个答案:

答案 0 :(得分:0)

我遇到与Failed to load extension File ~/Desktop/Chrome extension Error The 'manifest_version' key must be present and set to 2 (without quotes). See developer.chrome.com/extensions/manifestVersion.html for details. Could not load manifest. 有关的内存问题。

如果我交换$query->getSingleScalarResult()

return $query->getSingleScalarResult();

泄漏消失了。 您必须稍微更改查询并为结果命名:

$r = return $query->getResult();
return $r[0]['mysum'];