2

我对所有产品(在一个 cron 内)进行了一个简单的循环,以生成一个块并缓存结果,

但是 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 调用中处理每个循环项?

4

1 回答 1

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();

}

于 2013-01-26T23:10:31.403 回答