我对所有产品(在 cron 内)进行了一个简单的循环,以生成一个 block 并缓存结果,
但是 toHhtml 方法可以让每个产品的 memory_get_usage() 增长到大约 0.1M
我可以减少 getModel 负载的影响,但 toHTML 会杀死它
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 调用中处理每个循环项之外,还有什么想法吗?
最佳答案
您不需要每次都创建新的 block 实例。每次调用 toHtml()
时都会准备好数据,只需创建 $block1
一次并重复使用即可。
这应该删除对不再需要的模型实例的大量引用。
编辑:话虽这么说,您是否遗漏了为 block 注册产品实例的代码?应该是:
$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();
}
关于magento - block toHTML 导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14542471/