有没有办法加速这个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() . ")"
);
}
}
}
答案 0 :(得分:1)
尝试用以下代码替换产品:
...
foreach ($collection as $product) {
$productAttributeValue = $product->getAttributeText( $observe['attribute_code'] );
$r = 0;
...
您正在加载一个产品对象2次。 foreach中的$ product变量已经是加载的产品,其中包含您需要使用的属性。考虑到Magento的EAV数据库结构,加载具有其所有属性的$ product对象非常昂贵。
答案 1 :(得分: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('*');//this string should load all of the product attributes还有一些方法可以添加产品网站,产品商店和其他一些产品。