আমি বর্তমানে পারফরম্যান্স সম্পর্কে কয়েকটি মডিউল উন্নত করার চেষ্টা করছি।
আপনারা কেউ হয়ত সংগ্রহে থাকা পদ্ধতিটির ব্যবহার জানেন যা সরাসরি পণ্যগুলির মাধ্যমে লুপিং এড়াতে খুব দরকারী।walk()
তার উপরে এবং @ বিনাইকে ধন্যবাদ, কেউ সংগ্রহ delete()
পদ্ধতিটিও ব্যবহার করতে পারেন ।
তবে আমি লক্ষ্য করেছি যে ম্যাজেন্টো 1 নেটিভ ফাইলগুলি সর্বদা মুছে ফেলার জন্য কোনও পদ্ধতি ব্যবহার করে না।
আমি দেখেছি সবচেয়ে খারাপ কোডগুলির মধ্যে একটি হ'ল massDelete()
পদ্ধতিটি app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php
যেখানে থেকে মোছার আগে লুপগুলিতে পণ্যগুলি লোড করা হয় ।
foreach ($productIds as $productId) {
$product = Mage::getSingleton('catalog/product')->load($productId);
Mage::dispatchEvent('catalog_controller_product_delete', array('product' => $product));
$product->delete();
}
তাই আমি কিছু পারফরম্যান্স পরীক্ষা করেছি, নেওয়া সময় এবং 100 পণ্য মোছার জন্য মেমরির ব্যবহার পরীক্ষা করার জন্য কিছু লগিং কল যুক্ত করেছি।
পরীক্ষা 1: walk
পদ্ধতি
আমি এই কোডটি দিয়ে উপরে আটকানো মূল কোডটি প্রতিস্থাপন করেছি:
$collection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('entity_id')
->addIdFilter($productIds)
->walk('delete');
এবং আমার ফলাফলগুলি আমার ক্রপ্পে ডেভ সার্ভারে নিম্নলিখিত রয়েছে (10 টি পরীক্ষার ভিত্তিতে গড়ে)
- আসল কোড: 19.97 সেকেন্ড, 15.84MB ব্যবহৃত হয়েছে
- কাস্টম কোড: 17.12 সেকেন্ড, 15.45MB ব্যবহৃত হয়েছে
সুতরাং 100 টি পণ্য মোছার জন্য, আমার কাস্টম কোডটি 3 সেকেন্ড দ্রুত এবং 0.4MB কম ব্যবহার করে।
পরীক্ষা 2: সংগ্রহের delete()
পদ্ধতিটি ব্যবহার করে
আমি এইটির সাথে মূল কোডটি প্রতিস্থাপন করেছি:
$collection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('entity_id')
->addIdFilter($productIds)
->delete();
এবং মন এখানে ফুঁকছে ফলাফল:
- আসল কোড: 19.97 সেকেন্ড, 15.84MB ব্যবহৃত হয়েছে
- কাস্টম কোড: 1.24 সেকেন্ড, 6.34MB ব্যবহৃত হয়েছে
সুতরাং 100 টি পণ্য মোছার জন্য, আমার কাস্টম কোডটি 18 সেকেন্ড দ্রুত এবং 9MB কম ব্যবহার করে।
মন্তব্যে যেমন বলা হয়েছে, দেখে মনে হচ্ছে এই পদ্ধতিটি ম্যাজেন্টো ইভেন্টগুলি (লোডের পরে, মোছার পরে) বা সূচক / ক্যাশে ফ্লাশকে ট্রিগার করে না।
প্রশ্ন
সুতরাং আমার প্রশ্নটি হ'ল: এমন কোনও কারণ আছে যা কেন ম্যাজেন্টো কোর টিম একটি লুপে পণ্য লোড করার পরিবর্তে (যা আমরা সবাই জানি খুব খারাপ অনুশীলন) এর পরিবর্তে walk('delete')
সংগ্রহের delete()
পদ্ধতি বা ইভেন্টটি আরও ভালভাবে ব্যবহার না করে ?
মূল লক্ষ্য হল মডিউল বিকাশের ক্ষেত্রে এই জাতীয় মূল বিষয়গুলি সম্পর্কে সচেতন হওয়া: এখানে এমন কোনও বিশেষ ক্ষেত্রে রয়েছে যেখানে কেউ walk
/ সংগ্রহ delete()
পদ্ধতিটি ব্যবহার করতে পারে না ?
সম্পাদনা: কারণটি অবশ্যই catalog_controller_product_delete
প্রেরণের কারণে নয় কারণ একই কোডটি বেশ কয়েকটি জায়গায় ( massDelete
পদ্ধতিগুলি পরীক্ষা করে ) ম্যাজেন্টো কোরে পাওয়া যেতে পারে as আমি কার্যকারিতা হাইলাইট করতে পণ্যগুলির উদাহরণ ব্যবহার করেছি কারণ তারা সাধারণত বৃহত্তম সত্তা
delete()
সংগ্রহ লোড এবং প্রতিটি পণ্য মুছে ফেলার পরিবর্তে একটি মোছা ক্যোয়ারী তোলে। এটির সাথে আপনি সত্যিই ইভেন্টগুলি আলগা করবেন।
getSingleton()
পারফরম্যান্স সংগ্রহের ব্যবহারের পরিবর্তে কর্মক্ষমতা পরিমাপ হিসাবে ব্যবহার। ওহ এবংwalk()
শর্টকাটের সাহায্যে নয়, ইভেন্টটি সংগ্রহের মাধ্যমেও ট্রিগার করা সম্ভব ।