有什麼辦法可以加快這個Magento代碼?目前它正在瀏覽大約2k種產品,大約需要20分鐘才能運行。任何方式來加快這個Magento代碼?
我猜這個問題是圍繞產品 - >負載()調用,但我不夠熟悉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() . ")"
);
}
}
}
謝謝。這將時間從約20分鐘降低到約5分鐘。 –
您還會注意到一個很大的速度差異,取決於您運行代碼的硬件以及MySQL安裝的優化(稍微超出了問題範圍)。如果它解決了您的問題,請隨時單擊答案旁邊的複選標記以接受它;) – Roscius
更新。刪除了額外的產品 - >負載。這將時間縮短到〜5秒。再次,謝謝! –