2

このMagentoコードを高速化する方法はありますか?現在、約2kの製品を調べており、実行には約20分かかります。

問題はproduct->load()呼び出しにあると思いますが、Magentoにかかるオーバーヘッドを知るのに十分な知識がありません。

ありがとうございました。

コントローラーから

Mage::dispatchEvent(
    'category_rule_save',
    array(
        'rule_id'        => $id,
        'attribute_code' => $data['attribute_code'],
        'operator'       => $data['operator'],
        'value'          => $data['value'],
        'category_id'    => $data['category'],
        'store_id'       => $data['store_id']
    )
);

Observer.phpから

public function onCategoryRuleSave($observe)
{
    $collection =
        Mage::getModel('catalog/product')->getCollection()
            ->addAttributeToSelect($observe['attribute_code']);
    $write = Mage::getSingleton('core/resource')->getConnection('core_write');

    foreach ($collection as $product) {
        $productId = $product->getId();
        $product = $product->load($productId);
        $productAttributeValue = '';
        $productAttributeValue =
            Mage::getModel('catalog/product')->load($productId)
                ->getAttributeText( $observe['attribute_code'] );
        $r = 0;

        if ( is_numeric($observe['value']) ) {
            switch($observe['operator']) {
                case "<":
                    $r = ($productAttributeValue < $observe['value']) ? 1 : 0;
                    break;
                case ">":
                    $r = ($productAttributeValue > $observe['value']) ? 1 : 0;
                    break;
                case "<=":
                    $r = ($productAttributeValue <= $observe['value']) ? 1 : 0;
                    break;
                case ">=":
                    $r = ($productAttributeValue >= $observe['value']) ? 1 : 0;
                    break;
                case "==":
                    $r = ($productAttributeValue == $observe['value']) ? 1 : 0;
                    break;
                case "!=":
                    $r = ($productAttributeValue != $observe['value']) ? 1 : 0;
                    break;
            }
        }
        else {
            switch($observe['operator']) {
                case "==":
                    $r = (
                        strcmp(strtolower($productAttributeValue) , strtolower($observe['value'])) == 0
                    ) ? 1 : 0;
                    break;
                case "!=":
                    $r = (
                        strtolower($productAttributeValue) != strtolower($observe['value'])
                    ) ? 1 : 0;
                    break;
            }
        }

        if ($r==1) {
            $write->query(
                "REPLACE INTO `catalog_category_product` (`category_id`, `product_id`)
                VALUES (" . $observe['category_id'] . "," . $product->getId() . ")"
            );
        }
    }
}
4

2 に答える 2

1

製品の読み込みを次のように置き換えてみてください。

...
foreach ($collection as $product) {
 $productAttributeValue = $product->getAttributeText( $observe['attribute_code'] );
 $r = 0;
...

製品オブジェクトをさらに2回ロードしています。foreachの$product変数は、操作する必要のある属性を持つロードされた製品です。MagentoのEAVデータベース構造を考えると、すべての属性を含む$productオブジェクトのロードにはコストがかかります。

于 2012-06-18T20:10:38.780 に答える
0

1. $ collection =
        Mage :: getModel('catalog / product')-> getCollection()
        -> addAttributeToSelect($observe ['attribute_code']);

2.Mage :: getModel('catalog / product')-> load($ productId) -> getAttributeText($observe ['attribute_code']);

3. $ product = $ product-> load($ productId);

それは本当にひどいです:)

$ collection =
        Mage :: getModel('catalog / product')-> getCollection()
        -> addAttributeToSelect('*'); //この文字列は、すべての製品属性をロードする必要があります
製品のウェブサイト、製品ストアなどを追加する方法もいくつかありました。

于 2012-06-19T05:37:21.650 に答える