gpt4 book ai didi

php - 从 doctrine 中的表中检索所有行

转载 作者:可可西里 更新时间:2023-11-01 13:20:51 33 4
gpt4 key购买 nike

我有一个包含 100 000 多行的表,我想在 doctrine 中选择所有行并对每一行执行一些操作,在 symfony2 中我尝试使用此查询来执行此查询:

    $query = $this->getDefaultEntityManager()
->getRepository('AppBundle:Contractor')
->createQueryBuilder('c')
->getQuery()->iterate();

foreach ($query as $contractor) {
// doing something
}

但后来我得到内存泄漏,因为我认为它将所有数据写入内存。

我在 ADOdb 方面有更多经验,在我这样做的时候在那个库中:

$result = $ADOdbObject->Execute('SELECT * FROM contractors');
while ($arrRow = $result->fetchRow()) {
// do some action
}

我没有得到任何内存泄漏。

那么在 symfony2 中如何从表中选择所有数据并且不导致内存泄漏?

Question EDIT

当我尝试删除 foreach 并进行迭代时,我也会发生内存泄漏:

$query = $this->getDefaultEntityManager()
->getRepository('AppBundle:Contractor')
->createQueryBuilder('c')
->getQuery()->iterate();

最佳答案

正常的做法是使用iterate() .

$q = $this->getDefaultEntityManager()->createQuery('select u from AppBundle:Contractor c');
$iterableResult = $q->iterate();
foreach ($iterableResult as $row) {
// do something
}

但是,正如 Doctrine 文档所说,这仍然会导致错误。

Results may be fully buffered by the database client/ connection allocating additional memory not visible to the PHP process. For large sets this may easily kill the process for no apparant reason.

最简单的方法是简单地创建具有偏移量和限制的较小查询。

//get the count of the whole query first
$qb = $this->getDefaultEntityManager();
$qb->select('COUNT(u)')->from('AppBundle:Contractor', 'c');
$count = $qb->getQuery()->getSingleScalarResult();

//lets say we go in steps of 1000 to have no memory leak
$limit = 1000;
$offset = 0;

//loop every 1000 > create a query > loop the result > repeat
while ($offset < $count){
$qb->select('u')
->from('AppBundle:Contractor', 'c')
->setMaxResults($limit)
->setFirstResult($offset);
$result = $qb->getQuery()->getResult();
foreach ($result as $contractor) {
// do something
}
$offset += $limit;
}

对于如此繁重的数据集,这很可能会超过最大执行时间,默认情况下为30 秒。因此,请确保在您的 php.ini 中手动更改 set_time_limit。如果您只想使用已知模式更新所有数据集,您应该考虑编写一个大的更新查询,而不是在 PHP 中循环和编辑结果。

关于php - 从 doctrine 中的表中检索所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33252756/

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