Я согласен с Беном Лессани в том, что вам следует использовать core/iterator
модель ресурсов для загрузки больших коллекций по одной строке, если это возможно .
Тем не менее, есть ограничения. Как объясняется в разделе « addAttributeToSelect не работает с core / resource_iterator? », Он не очень хорошо работает с моделями EAV, если вам нужно включить значения из таблиц значений атрибутов.
И связанный пример из StackOverflow на самом деле не так хорош, потому что он повторяет один и тот же запрос с разными LIMIT
выражениями. Для сложных запросов это может быть проблемой производительности, но что еще более важно, вы получите дубликаты, если между ними будут добавлены новые строки.
Лучший способ обработки коллекций в чанках - это сначала загрузить все идентификаторы, а затем использовать эти идентификаторы в качестве фильтра для действительной выгружаемой коллекции.
Простой пример для продуктов:
$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());