Answers:
你真的应该用
Mage::getSingleton('core/resource_iterator')
为此,它的存在纯粹是出于您提到的性能原因。
否则,您可以在循环中使用稍微不太优雅的解决方案setPageSize
-这里有一个很好的例子,https://stackoverflow.com/questions/3786826/how-to-loop-a-magento-collection
setPageSize
因为它是语义。
core/resource_iterator
解决方案实际上并未对mysql查询进行分页。它一次加载了整个结果集,但是随后一次给您一行以处理您的PHP代码。因此,它确实避免了PHP内部的内存错误,但是如果结果集很大,则在某些时候它将触发mysql max数据包大小。我认为我将尝试使用setPageSize()
我同意Ben Lessani的观点,如果可能的话,应该使用core/iterator
资源模型一次加载大集合。
但是,有局限性。如“ addAttributeToSelect不能与core / resource_iterator一起使用? ”中所述,如果需要包括属性值表中的值,则它不适用于EAV模型。
而且,来自StackOverflow的链接示例实际上并不是那么好,因为它使用不同的LIMIT
表达式重复了相同的查询。对于复杂的查询,这可能是性能问题,但更重要的是,如果在两者之间添加新行,则会得到重复。
处理大块集合的更好方法是先加载所有ID,然后将这些ID用作实际分页集合的过滤器。
$ids = Mage::getModel('catalog/product')
->getCollection()
->getAllIds();
$page = 1;
do {
$collection = Mage::getModel('catalog/product')
->getCollection()
->addIdFilter($ids)
->setPageSize(100)
->setCurPage($page);
$results = $collection->load();
// do stuff ......
$page++;
} while ($results->count());