gpt4 book ai didi

php - Doctrine - namedQuery 执行导致内存泄漏?

转载 作者:行者123 更新时间:2023-11-29 03:16:39 24 4
gpt4 key购买 nike

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

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

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

我也试过在实体管理器配置中禁用 sql 记录器,但这没有帮助。任何人都知道可能出了什么问题吗?

命名查询

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);

最佳答案

我遇到了与 $query->getSingleScalarResult() 相关的内存问题。

如果我将 return $query->getSingleScalarResult(); 交换为

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

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

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

关于php - Doctrine - namedQuery 执行导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55075984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com