我对所有产品(在cron内)做一个简单的循环来生成一个块并缓存结果,
但是toHhtml方法让memory_get_usage()每个产品增长到大约0.1M
我可以减少getModel加载的效果,但是HTML会杀死它
foreach($products as $productid) {
// leaks but clear instance helps
$model = Mage::getModel("catalog/product")->load($productid);
$block1 = Mage::app()->getLayout()->createBlock("catalog/product_list_upsell");
$block1 = $block1->setTemplate("catalog/product/list/upsell.phtml");
// kills it
cacheContent($block1->toHTml());
// this helps
$model->clearInstance();
}
任何想法,除了在单独的php调用中处理每个循环项目?
答案 0 :(得分:2)
您不需要每次都创建新的块实例。每次调用toHtml()
时都会准备好数据,只需创建$block1
一次并重复使用。
这应该删除大量不再需要的模型实例的引用。
编辑:话虽如此,您是否遗漏了为块注册产品实例的代码?它应该是:
$block1 = Mage::app()->getLayout()->createBlock("catalog/product_list_upsell");
$block1 = $block1->setTemplate("catalog/product/list/upsell.phtml");
foreach($products as $productid) {
$model = Mage::getModel("catalog/product")->load($productid);
Mage::unregister('product');
Mage::register('product', $model);
cacheContent($block1->toHTml());
$model->clearInstance();
}