Magento: Bir ürün özelliğini güncellemenin en hızlı yolu


15

Toplu özellik güncellemesi için en hızlı ve güvenilir yöntemi arıyorum. Aşağıda bildiğim yöntemler var ama hangisine gitmem gerektiğini bilmiyorum.

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

veya

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

Yanıtlar:


31

En hızlı yol, veritabanında doğrudan seçimler ve eklemeler / güncellemeler yapmaktır, ancak bu en güvenli değildir. Eşyaları kolayca kırabilirsiniz.

Kullandığım Mage::getSingleton('catalog/product_action')->updateAttributes(...)yaklaşım.
Hızlıdır, ürün özelliklerini toplu olarak güncellemek için kullanabilir, belirli bir mağaza için özellik değerini güncelleyebilirsiniz.
Sanırım gerekli olan çoğu vakayı kapsıyor.


teşekkürler marius ben yanıt bekliyordum, btw nihai modül yaratıcısı kool
Deepak Mallah

1
aslında en hızlı seçim değil ... Cevabımı aşağıda kontrol edin
Fra

@Fra Yönteminiz nasıl daha hızlı? İçerir load. hızlı bir şey değil. Örneğin, yöntem 2'de ürün yüküne sahip ilk satır işe yaramaz. Hiçbir $productyerde kullanmıyorsunuz .
Marius

@Fra. Birinin cevabını küçümsediğinizde, bir sebep belirtmek güzel bir şeydir. Cevabımın nesi var?
Marius

1
Aynı şeyi cevabınız için de söyleyebilirim ... bu en hızlı yol değil. doğrudan SQL sorguları en hızlı yoldur. Nedeni küçümsemek için yeterli olduğunu sanmıyorum. Ama siz fikriniz var.
Marius

27

Aslında, bir ürünü tüm ürünü kaydetmeden güncellemenin 3 yolu vardır. Kod / gereksinimlere bağlı olarak biri diğerinden daha hızlı olabilir.

Yöntem 1:

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

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

Yöntem 2:

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

Yöntem 3: (en hızlı)

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

Yukarıdaki tüm yöntemler zaten tüm ürünü kurtarmak çok daha hızlıdır bazı büyük performans farkı vardır:

Method 1:

  • en hızlısıdır, ancak ürünü yüklemenizi gerektirir.
  • reindex olayını tetiklemez (bu yüzden daha hızlıdır)
  • ön uçta çalışır

Method 2:

  • ürünün toplu olarak güncellenmesine izin verir
    (birden fazla ürün ve birden fazla özellik iletebilirsiniz)
  • toplu eylem olayını ve bağıl bağımlı reindex'i tetikler
  • ön uçta çalışmıyor

Method 3:

  • yöntem 2'ye benzer, ancak başka bir gözlemci / dizinleyici çağırmaz
    (bu nedenle yöntem 1 ve 2 arasında karışık bir yaklaşımdır)

Yöntem 3, bu ürün / nitelikleri el ile yeniden dizine eklemek için daha esnek olan yöntemdir. (ön
uçta güncellenmelerini sağlamak için) Çok sayıda ürünü hızlı bir şekilde güncellemek ve daha sonra sonunda reindex'i aramak istiyorsanız yararlı olabilir.
(yöntem 2'yi kullanırsanız, güncellemeden sonra her ürün için bir reindex çağrılır ve bu çoklu çağrılar tüm süreci yavaşlatır)

Tek bir ürünü manuel olarak yeniden dizine eklemek için Mage_Catalog_Model_Product_Flat_Indexer tarafından sağlanan aşağıdaki gibi işlevlere bakın :

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

4
downvote yorum yapmak her zaman daha iyi olurdu ...
Fra

Sadece küçük bir not, $ değeri arayüzünüzde gördüğünüz 'metin' değeri değil, bir değer kodu (tamsayı) olmalıdır
Ali Alwash

hmmm ilginç. Yöntem 2 harika görünüyor, sadece 'geri bildirim' üzerinde ne başarılı oldunuz, ne oldu, ne olmadı? Yöntem 1 de iyidir. Ancak veri üzerinde döngüümü güncellemeyi bitirdiğimde: el ile reindex'i tekmeleyebilir, belki de bu partikül ürün kimlikleri için çözebilir miyim?
snh_nl

Garip. Yöntem 2'yi kullanarak bilinmeyen bir filtre alıyorum. `` Yakalanan kural dışı durum: SQLSTATE [42S22]: Sütun bulunamadı: 1054 Bilinmeyen sütun 'katalog_product_entity.value_id' 'alan listesinde', sorgu: SELECT catalog_product_entity. value_idDAN catalog_product_entityWHERE (entity_type_id = 4 VE attribute_id = '68' AND ENTITY_ID = '29' ) `` `o beklemiyordum. 1.9.3.2 Running on
snh_nl

1
Beni saatlerce kurtardı.
dipole_moment

3

Güncelleme

Toplu özellik güncellemesi için en hızlı ve güvenilir yöntemi arıyorum

Özellikler veya ürünler için "toplu özellik güncellemesi"?

Birden fazla özelliği güncellemenin yanıtlandığını düşünün, ancak ürünler için bu yararlı olabilir ...

Ürünleri koleksiyondan güncellemek istiyorsanız, bunu yapmamalısınız ...

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

Bu olayları gönderir, fiyatçıları ve endeksleri yeniden oluşturur. Bununla hiçbir olay (ve diğer bazı şeyler) atlanmaz ve çok daha hızlıdır.

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

Fiyatlandırma güncellemelerinden kaçınmak için şunu ekleyebilirsiniz ...

$product->setIsMassupdate(true);

Reindex'i anında devre dışı bırakmak / etkinleştirmek için şuna bir göz atın ... https://github.com/Flagbit/Magento-ChangeAttributeSet/commit/676f3af77fec880bc64333403675d183e8639fae

/**
 * 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();
    }
}

Ayrıca, toplu (ürün) güncellemeden önce önbelleği temizlemek performansı artırabilir ...

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

Hata ayıklama işleminden bazı numaralar: https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16


Mage::getSingleton('catalog/product_action')->updateAttributes(...) en hızlı yöntem gibi görünmüyor ... en azından mutlistore kurulumu ve düz tablolar açıkken değil ...

  • saveAttribute()

    $product = Mage::getModel('catalog/product')->load($productId);
    $resource = $product->getResource();
    $product->setData($attributeCode, $attributeValue);
    $resource->saveAttribute($product, $attributeCode);
    • Toplam Dahil Duvar Zamanı (microsec): 437,787 microsec
    • Toplam Dahil İşlemci (microsecs): 423.600 microsecs
    • Toplam Dahil MemUse (bayt): 4.433.848 bayt
    • Toplam Dahil PeakMemUse (bayt): 4,395,128 bayt
    • İşlev Çağrı Sayısı: 25.711
  • updateAttributes()

    Mage::getSingleton('catalog/product_action')->updateAttributes(
        array($productId),
        array($attributeCode => $attributeValue),
        $storeId
    );
    • Toplam Dahil Duvar Süresi (mikrosaniye): 3,676,950 mikrosaniye
    • Toplam Dahil İşlemci (microsecs): 3.122.064 microsecs
    • Toplam Dahil MemUse (bayt): 8.174.792 bayt
    • Toplam Dahil PeakMemUse (bayt): 8.199.192 bayt
    • İşlev Çağrı Sayısı: 150.132
  • updateAttributes() (kaynak tekil)

    Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
        array($productId),
        array( $attributeCode => $attributeValue),
        $storeId
    );
    • Toplam Dahil Duvar Süresi (mikro saniye): 94.155 mikro saniye
    • Toplam Dahil İşlemci (microsecs): 48.568 microsecs
    • Toplam Dahil MemUse (bayt): 1.426.304 bayt
    • Toplam Dahil PeakMemUse (bayt): 1,370,456 bayt
    • İşlev Çağrı Sayısı: 2.221

bu işlevin neden farklı zamanlar aldığını anlamak için cevabımı inceleyebilirsiniz ...
Fra

Açılır veriler updateAttributes() (resource singleton)için gerçek yönetici değeri alınır mı? veya açılır öğenin kimliği? (bir şekilde bu yöntemi kullanarak her zaman değer / boş değer
almıyoruz,

@snh_nl, çoklu seçim özellikleri için ayrılmış kimlik - virgülünü kullanmanız gerekir.
sv3n
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.