我最近发现了以下关于在调用大型产品集合时使用 Magento 的资源迭代器模型来节省资源的文章 - http://www.fontis.com.au/blog/magento/loading-large-collections 。但是,我发现很难确切地弄清楚如何让它输出完全相同的数据。
因此,假设我使用以下方法获取完整的产品集合并输出 sku:
$productCollection = Mage::getModel('catalog/product')->getCollection();
foreach($productCollection as $product){
echo $product->getSku().',';
}
使用探查器,我发现这使用了 1,154,480 字节来处理。
现在使用资源迭代器模型,如下所示:
function productCallback($args)
{
$product = Mage::getModel('catalog/product');
$product->setData($args['row']);
echo $product->getSku().',';
}
$_productCollection = Mage::getModel('catalog/product')->getCollection();;
$_productCollection = Mage::getSingleton('core/resource_iterator')->walk($_productCollection->getSelect(), array('productCallback'));
这使用了 199,912 字节。因此,获得相同的东西有很大的不同,只是一个基本的 sku 列表。
但我的问题是,例如,如果我想制作一个样式精美的产品列表,并获取它们的图像、网址等,我之前会在 $productCollection 上使用 foreach 循环,如第一个示例所示:
foreach($_productCollection as $product){
echo $product->getSku().',';
};
但这不再有效。看起来,当它经历回调时,其作用与 foreach 循环相同,依次运行每个产品。
那么,如何使我的集合恢复为与以前相同的格式,以便它再次在 foreach 循环中工作?我需要将产品添加到数组中吗?如果是这样,我该怎么做?
最佳答案
我认为您可能没有捕获重点。当您不需要完整的面向对象方法或记录数组并且可以使用数据库中的原始值时,资源迭代器非常有用。
为了输出图像和价格等内容,您需要具有计算图像缩略图或折扣如何影响价格的功能的产品对象实例。此外,当产品对象加载时,它会触发各种事件,以便其他模块也可以进行修改,这也是 Magento 如此可扩展的部分原因。如果您担心内存使用或执行时间,那么 cache the product list block并且不要更改任何其他内容。
关于magento - 在产品集合上使用 Magento 的资源迭代器模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7419886/