如何在PHP + Doctrine中执行巨大循环?

blu*_*ean 1 php performance symfony doctrine-orm

我正在尝试使用Symfony2(MongoDB + Doctrine)在PHP中开发一个简单的“ Ranking”脚本。

    $users = $dm->createQueryBuilder('Account')
                ->sort('points', 'DESC')
                ->getQuery()
                ->execute();

    foreach($users as $user){
            // Do nothing
    }
Run Code Online (Sandbox Code Playgroud)

我遇到以下问题:

PHP致命错误:耗尽了134217728字节的允许的内存大小(尝试分配25个字节)

我的数据库有80.000个用户,因此$ users拥有所有用户。

好吧,我知道我可以修改php config以允许更多的内存。我要去做。但是我正在寻找其他类型的解决方案(向PHP配置中添加额外的内存)。

我的想法是我尝试使用“分页”来开发它,但是它也不起作用(我在用户272处收到错误,第3次迭代):

    $limit = 100;
    $skip = 0;

    $total = $dm->createQueryBuilder('Account')->count()->getQuery()->execute();
    $max = $total/$limit;

    while($skip<=$max){

        $users = $dm->createQueryBuilder('Account')
            ->sort('points', 'DESC')
            ->limit($limit)
            ->skip($skip*$limit) // 0x100, 1x100, 2x100, 3x100
            ->getQuery()
            ->execute();

        foreach($users as $user){
               // Do nothing
        }

        $skip++;

    }
Run Code Online (Sandbox Code Playgroud)

你知道我该怎么办吗?

PS:我认为我已经完成了本文中的建议:如何使用symfony和doctrine处理庞大的select查询?

Mat*_*son 6

请参阅iterate()方法的文档。正是为此目的而设计的。

您可以使用iterate()方法来迭代较大的结果,而无需执行UPDATE或DELETE意图。从$ query-> iterate()返回的IterableResult实例实现了Iterator接口,因此您可以处理较大的结果而不会出现内存问题。

使用时请不要忘记detach结果。