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查询?
请参阅该iterate()方法的文档。正是为此目的而设计的。
您可以使用iterate()方法来迭代较大的结果,而无需执行UPDATE或DELETE意图。从$ query-> iterate()返回的IterableResult实例实现了Iterator接口,因此您可以处理较大的结果而不会出现内存问题。
使用时请不要忘记detach结果。