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 に答える