Şu anda performansla ilgili birkaç modülü geliştirmeye çalışıyorum.
Bazılarınız, doğrudan ürünlerin arasında dolaşmayı önlemek için çok yararlı olan toplama yönteminin kullanımını biliyor olabilirsiniz .walk()
Bunun üzerine ve @Vinai sayesinde , toplama delete()
yöntemi de kullanılabilir .
Ancak Magento 1 yerel dosyalarının her zaman silmek için bu yöntemlerden hiçbirini kullanmadığını fark ettim.
Gördüğüm en kötü kod biri massDelete()
itibaren yöntem app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php
nerede ürünler silmeden önce bir döngü içinde yüklenir .
foreach ($productIds as $productId) {
$product = Mage::getSingleton('catalog/product')->load($productId);
Mage::dispatchEvent('catalog_controller_product_delete', array('product' => $product));
$product->delete();
}
Bu yüzden bazı performans testleri yaptım, geçen süreyi ve 100 ürünün silinmesi için bellek kullanımını kontrol etmek için bazı günlük çağrıları ekledim.
Test 1: walk
yöntem
Yukarıda yapıştırılan orijinal kodu bu kodla değiştirdim:
$collection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('entity_id')
->addIdFilter($productIds)
->walk('delete');
Ve sonuçlarım crappy dev sunucumda şu şekildedir (ortalama 10 teste dayanmaktadır):
- Orijinal kod: 19.97 saniye, 15.84MB kullanılmış
- Özel kod: 17.12 saniye, 15.45MB kullanılmış
100 ürün silme için özel kodum 3 saniye daha hızlı ve 0,4MB daha az kullanıyor.
Test 2: Toplama delete()
yöntemini kullanma
Orijinal kodunu bununla değiştirdim:
$collection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('entity_id')
->addIdFilter($productIds)
->delete();
Ve burada üflenen zihin sonuçları:
- Orijinal kod: 19.97 saniye, 15.84MB kullanılmış
- Özel kod: 1.24 saniye, 6.34MB kullanılmış
Bu yüzden 100 ürün silme için özel kodum 18 saniye daha hızlı ve 9 MB daha az kullanıyor.
Yorumlarda belirtildiği gibi, bu yöntem Magento olaylarını (yükten sonra, sildikten sonra) veya dizin / önbellek sifonunu tetiklemiyor gibi görünüyor.
Soru
Yani sorum şu: Magento çekirdek ekibinin, ürünleri bir döngüde yüklemek yerine ( walk('delete')
ya da delete()
çok kötü bir uygulama olduğunu bildiğimiz) toplama yöntemini veya olayı daha iyi kullanmamasının bir nedeni var mı?
Ana amaç, bir modül geliştirme durumunda bu kilit noktaların farkında olmaktır: / collection yöntemini kullanamayan belirli durumlar var mı?walk
delete()
DÜZENLEME: Nedeni kesinlikle Magento çekirdeğinde catalog_controller_product_delete
birkaç yerde aynı massDelete
yöntemleri ( yöntemleri kontrol ) bulunabilir olarak sevk olay nedeniyle değildir . Genellikle en büyük varlıklar oldukları için performansı vurgulamak için ürün örneğini kullandım
delete()
koleksiyonu yüklemek ve her ürünü silmek yerine SİL sorgusu yapar. Bununla gerçekten olayları kaybedeceksiniz.
getSingleton()
belirgin toplama kullanımı yerine performans ölçüsü olarak kullanılması. Oh ve olayı bir koleksiyonla da tetiklemek mümkün, sadecewalk()
kısayol ile değil .