Magento: उत्पाद विशेषता को अपडेट करने का सबसे तेज़ तरीका


15

मैं बड़े पैमाने पर विशेषता अद्यतन के लिए सबसे तेज़ और विश्वसनीय विधि की तलाश कर रहा हूं। नीचे दिए गए तरीकों के बारे में पता है, लेकिन मुझे नहीं पता कि मुझे किसके साथ जाना चाहिए।

$store_id = 0;
Mage::getSingleton('catalog/product_action')->updateAttributes(
    array($product_id),
    array('attribute_code' => $attribute_code),
    $store_id
);

या

$product->setData($attribute_code, 1234); 
$product->getResource()->saveAttribute($product, $attribute_code); 

जवाबों:


31

सबसे तेज़ तरीका डेटाबेस में प्रत्यक्ष चयन और आवेषण / अपडेट करना है, लेकिन यह सबसे सुरक्षित नहीं है। आप आसानी से सामान तोड़ सकते हैं।

मैं Mage::getSingleton('catalog/product_action')->updateAttributes(...)दृष्टिकोण का उपयोग करता हूं ।
यह तेज़ है, आप इसे उत्पाद अद्यतन को बल्क अपडेट करने के लिए उपयोग कर सकते हैं, आप किसी विशिष्ट स्टोर के लिए विशेषता मान अपडेट कर सकते हैं।
मुझे लगता है कि इसमें अधिकांश मामलों को शामिल किया गया है।


धन्यवाद marius मैं आपकी प्रतिक्रिया की उम्मीद कर रहा था, btw अपने परम मॉड्यूल निर्माता kool है
दीपक मल्लाह

1
यह वास्तव में सबसे तेज चयन नहीं है ... नीचे मेरे उत्तर की जांच करें
फ्रा

@ फ्राँ आपका तरीका कितना तेज़ है? इसमें शामिल है load। कुछ भी लेकिन तेजी से। उदाहरण के लिए, विधि 2 में, उत्पाद लोड के साथ पहली पंक्ति बेकार है। आप $productकहीं भी उपयोग नहीं कर रहे हैं ।
मेरियस

@Fra। जब आप किसी के उत्तर को अस्वीकार करते हैं तो यह एक कारण बताने के लिए एक अच्छी बात है। मेरे जवाब में क्या गलत है?
मेरियस

1
मैं आपके उत्तर के लिए एक ही बात कह सकता हूं ... यह सबसे तेज़ तरीका नहीं है। प्रत्यक्ष SQL क्वेरी सबसे तेज़ तरीका है। मुझे नहीं लगता कि आपके कारण को कम करने के लिए पर्याप्त है। लेकिन आप अपनी राय के हकदार हैं।
मेरियस

27

वास्तव में पूर्ण उत्पाद को बचाने के बिना किसी उत्पाद पर विशेषता को अपडेट करने के 3 तरीके हैं। कोड / आवश्यकताओं के आधार पर एक तेज हो सकता है कि दूसरा।

विधि 1:

$product = Mage::getModel('catalog/product')->load($product_id);
$resource = $product->getResource();

$product->setData($attribue_code, $value);
$resource->saveAttribute($product, $attribute_code);

विधि 2:

$updater = Mage::getSingleton('catalog/product_action');
$updater->updateAttributes(array($product_id), array( $attribute_code => $value), 0);

विधि 3: (सबसे तेज़)

 $update_resource = Mage::getResourceSingleton('catalog/product_action');
 $update_resource->updateAttributes(array($product_id), array( $attribute_code => $value), 0);

उपरोक्त सभी विधि बहुत तेज़ हैं जो पूरे उत्पाद को बचाती हैं वैसे भी कुछ प्रमुख प्रदर्शन अंतर हैं:

Method 1:

  • सबसे तेज़ है, लेकिन आपको उत्पाद लोड करने की आवश्यकता है।
  • यह reindex घटना को ट्रिगर नहीं करता है (इसीलिए तेज है)
  • यह दृश्यपटल में काम करता है

Method 2:

  • उत्पाद अपडेट करने की अनुमति देता है
    (आप कई उत्पाद और कई विशेषताएँ पास कर सकते हैं)
  • यह बड़े पैमाने पर कार्रवाई की घटना और रिश्तेदार निर्भर reindex चलाता है
  • यह दृश्यपटल में काम नहीं करता है

Method 3:

  • यह विधि 2 की तरह है, लेकिन किसी अन्य पर्यवेक्षक / इंडेक्सर को नहीं बुलाता है
    (इसलिए यह विधि 1 और 2 के बीच मिश्रित दृष्टिकोण है)

विधि 3 अधिक लचीली है, वैसे भी आपको उन उत्पादों / विशेषताओं को मैन्युअल रूप से रिवाइंड करना होगा। (सीमांत पर उन्हें अद्यतन करने के लिए)
यह बहुत उपयोगी हो सकता है यदि आप बहुत सारे उत्पादों को तेजी से अपडेट करना चाहते हैं और फिर अंत में रेनडेक्स को कॉल करें।
(यदि आप विधि 2 का उपयोग करते हैं, तो प्रत्येक उत्पाद को अद्यतन के बाद कॉल करने के लिए एक reindex और ये कई कॉल पूरी प्रक्रिया को धीमा कर देते हैं)

किसी एकल उत्पाद को मैन्युअल रूप से reindex करने के लिए Mage_Catalog_Model_Product_Flat_Indexer जैसे कार्य प्रदान करते हैं:

  • updateAttribute($attributeCode, $store = null, $productIds = null)
  • updateProduct($productIds, $store = null)
  • ...

4
हमेशा टिप्पणी करना बेहतर होगा ...
Fra

बस एक छोटा सा नोट, $ मूल्य एक मूल्य कोड (पूर्णांक) होना चाहिए, न कि आपके इंटरफ़ेस में आपके द्वारा देखा जाने वाला 'शाब्दिक' मूल्य
अली अलाव

हम्म् दिलचस्प। विधि 2 बहुत अच्छा लगता है, केवल आपके पास 'फीडबैक' पर कोई नियंत्रक नहीं है कि क्या सफल हुआ, क्या नहीं? विधि 1 भी अच्छा है। लेकिन जब मुझे डेटा पर अपना लूप अपडेट करने का काम किया जाता है: क्या मैं पार्टिकुलर उत्पाद आईडी के लिए इसे हल करने के लिए मैन्युअल रूप से रिंडेक्स को किक कर सकता हूं?
snh_nl

अजीब। विधि 2 का उपयोग करना। मुझे कॉलम `` `द्वारा अपवाद में एक त्रुटि अज्ञात फ़िल्टर मिल रहा है: SQLSTATE [42S22]: कॉलम नहीं मिला: 1054 अज्ञात कॉलम 'कैटलॉग_प्रोडक्ट_वेंटी.वेल्यू_ड' में 'फ़ील्ड सूची', क्वेरी थी: चयन catalog_product_entityvalue_idसे catalog_product_entityजहां (entity_type_id = 4 और attribute_id = '68 'और ENTITY_ID = '29') `` `कि उम्मीद नहीं। 1.9.3.2 पर चल रहा है
snh_nl

1
मुझे काम के घंटे बचाता है।
डिपोल_मोमेंट

3

अपडेट करें

मैं बड़े पैमाने पर विशेषता अद्यतन के लिए सबसे तेज़ और विश्वसनीय विधि की तलाश कर रहा हूं

विशेषताओं या उत्पादों के लिए "मास विशेषता अद्यतन"?

लगता है कि कई विशेषताओं को अद्यतन किया गया है, लेकिन इसका उपयोग उपयोगी हो सकता है ...

यदि आप संग्रह से उत्पादों को अद्यतन करना चाहते हैं, तो आपको ऐसा नहीं करना चाहिए ...

foreach ($collection as $product) {
    $product->setSomeData(...);
    # not here
    $product->save();
}

यह घटनाओं को फिर से भेजेगा, प्रिस्क्रिप्शन और सूचकांकों का पुनर्निर्माण करेगा। इसके साथ कोई घटना (और कुछ अन्य चीजें) छोड़ दी जाती हैं और बहुत तेज होती हैं।

foreach ($collection as $product) {
    $product->setSomeData(...);
}
$collection->save();

भविष्य के अद्यतन से बचने के लिए, आप जोड़ सकते हैं ...

$product->setIsMassupdate(true);

मक्खी पर रेनडेक्स को निष्क्रिय / सक्षम करने के लिए इस पर एक नज़र डालें ... https://github.com/Flagbit/Magento-ChangeAttributeSet/commit/676f3af77fec880bc64333n367536183e8639fae

/**
 * Set indexer modes to manual
 */
private function _storeRealtimeIndexer()
{
    $collection = Mage::getSingleton('index/indexer')->getProcessesCollection();
    foreach ($collection as $process) {
        if($process->getMode() != Mage_Index_Model_Process::MODE_MANUAL){
            $this->_index[] = $process->getIndexerCode();
            $process->setData('mode', Mage_Index_Model_Process::MODE_MANUAL)->save();
        }
    }

}
/**
 * Restore indexer modes to realtime an reindex product data
 */
private function _restoreRealtimeIndexer()
{
    $reindexCodes = array(
        'catalog_product_attribute',
        'catalog_product_flat'
    );
    $indexer = Mage::getSingleton('index/indexer');
    foreach ($this->_index as $code) {
        $process = $indexer->getProcessByCode($code);
        if (in_array($code, $reindexCodes)) {
            $process->reindexAll();
        }
        $process->setData('mode', Mage_Index_Model_Process::MODE_REAL_TIME)->save();
    }
}

और बड़े पैमाने पर (उत्पाद) अद्यतन से पहले कैश फ्लशिंग भी प्रदर्शन को बढ़ा सकता है ...

Mage::app()->getCacheInstance()->flush();

डिबगिंग के कुछ नंबर यहां: https://github.com/Flagbit/Magento-ChangeAttributeSet//ues/16


Mage::getSingleton('catalog/product_action')->updateAttributes(...) लगता है सबसे तेज़ तरीका नहीं है ... कम से कम नहीं म्यूटलिस्टोर सेटअप और फ्लैट टेबल चालू होने के साथ ...

  • saveAttribute()

    $product = Mage::getModel('catalog/product')->load($productId);
    $resource = $product->getResource();
    $product->setData($attributeCode, $attributeValue);
    $resource->saveAttribute($product, $attributeCode);
    • टोटल इंक्ल। दीवार समय (microsec): 437,787 microsecs
    • टोटल इंक्ल। CPU (microsecs): 423,600 microsecs
    • टोटल इंक्ल। मेम्यूज़ (बाइट्स): 4,433,848 बाइट्स
    • टोटल इंक्ल। पीकम्यूसे (बाइट्स): 4,395,128 बाइट्स
    • फ़ंक्शन कॉल की संख्या: 25,711
  • updateAttributes()

    Mage::getSingleton('catalog/product_action')->updateAttributes(
        array($productId),
        array($attributeCode => $attributeValue),
        $storeId
    );
    • टोटल इंक्ल। दीवार समय (microsec): 3,676,950 microsecs
    • टोटल इंक्ल। CPU (microsecs): 3,122,064 microsecs
    • टोटल इंक्ल। मेम्यूज़ (बाइट्स): 8,174,792 बाइट्स
    • टोटल इंक्ल। पीकममूसे (बाइट्स): 8,199,192 बाइट्स
    • फ़ंक्शन कॉल की संख्या: 150,132
  • updateAttributes() (संसाधन सिंगलटन)

    Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
        array($productId),
        array( $attributeCode => $attributeValue),
        $storeId
    );
    • टोटल इंक्ल। दीवार समय (माइक्रोसेक): 94,155 माइक्रोसैक
    • टोटल इंक्ल। CPU (microsecs): 48,568 microsecs
    • टोटल इंक्ल। मेम्यूज़ (बाइट्स): 1,426,304 बाइट्स
    • टोटल इंक्ल। PeakMemUse (बाइट्स): 1,370,456 बाइट्स
    • फ़ंक्शन कॉल की संख्या: 2,221

आप यह समझने के लिए मेरे उत्तर की समीक्षा कर सकते हैं कि उन कार्यों में अलग-अलग समय क्यों लगता है ...
Fra

ड्रॉपडाउन डेटा के updateAttributes() (resource singleton)लिए वास्तविक एडमिन वैल्यू लेता है? या ड्रॉपडाउन तत्व की आईडी? (किसी तरह हम हमेशा इस पद्धति का उपयोग करके कोई मूल्य / खाली मान प्राप्त नहीं करते हैं अर्थात चयनित कुछ भी नहीं
snh_nl

@snh_nl आपको मल्टीसेप्ट विशेषताओं के लिए आईडी - अल्पविराम का उपयोग करना होगा।
sv3n
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.