ম্যাজেন্টো 1: সত্তা মুছতে পারফরমেন্স অপ্টিমাইজেশন


10

আমি বর্তমানে পারফরম্যান্স সম্পর্কে কয়েকটি মডিউল উন্নত করার চেষ্টা করছি।

আপনারা কেউ হয়ত সংগ্রহে থাকা পদ্ধতিটির ব্যবহার জানেন যা সরাসরি পণ্যগুলির মাধ্যমে লুপিং এড়াতে খুব দরকারী।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 আমি কার্যকারিতা হাইলাইট করতে পণ্যগুলির উদাহরণ ব্যবহার করেছি কারণ তারা সাধারণত বৃহত্তম সত্তা


3
আমি অনুমান করি এটি ইভেন্টের কারণে। তবে আমি আপনার সাথে একমত, এটি খারাপ স্টাইল, বিশেষত getSingleton()পারফরম্যান্স সংগ্রহের ব্যবহারের পরিবর্তে কর্মক্ষমতা পরিমাপ হিসাবে ব্যবহার। ওহ এবং walk()শর্টকাটের সাহায্যে নয়, ইভেন্টটি সংগ্রহের মাধ্যমেও ট্রিগার করা সম্ভব ।
ফ্যাবিয়ান শেমংলার

1
@fschmengler হ্যাঁ আমি ইভেন্টটি সম্পর্কেও ভেবেছিলাম তবে আমি আমার সম্পাদনায় যেমন বলেছি, এটি এমন অনেক জায়গায় ঘটছে যেখানে কোনও অনুষ্ঠান প্রেরণ হচ্ছে না।
রাফেল ডিজিটাল পিয়ানোবাদ

3
বিস্ময়কর না. delete()সংগ্রহ লোড এবং প্রতিটি পণ্য মুছে ফেলার পরিবর্তে একটি মোছা ক্যোয়ারী তোলে। এটির সাথে আপনি সত্যিই ইভেন্টগুলি আলগা করবেন।
ফ্যাবিয়ান শেমংলার

5
@fschmengler একটি সংগ্রহ মুছে ফেলা প্রতিটি স্বতন্ত্র আইটেমের জন্য একটি মুছুনও করে, তবে এটি ক্যাশে সাফ করার এবং কিছু ম্যাজেন্টো এবং সূচক ইভেন্টগুলি ট্রিগার করার বাইপাস করে। পার্থক্যটি এখান থেকেই আসা উচিত।
বিনাই

2
@ বিনাই আপনি ঠিক বলেছেন আমার পক্ষে
শুভাকাঙ্ক্ষী

উত্তর:


4

তাই আমি কিছু পারফরম্যান্স পরীক্ষা করেছি, নেওয়া সময় এবং 100 পণ্য মোছার জন্য মেমরির ব্যবহার পরীক্ষা করার জন্য কিছু লগিং কল যুক্ত করেছি

পার্শ্ব নোট, তবে আপনার এটির জন্য ভারিয়ান প্রোফাইলার ব্যবহার করা উচিত!

আমার কাস্টম কোডটি 2 সেকেন্ড দ্রুত এবং এটি 0.4MB কম ব্যবহার করে

যদিও আমি সন্দেহ করি না যে আপনার পরিবর্তনটি কার্যকারিতা উন্নত করবে, উন্নতিগুলির তুলনা করার জন্য "পূর্বে" ফলাফল সরবরাহ করা কার্যকর হবে।

কোনও কারণ আছে যে কেন ম্যাজেন্টো কোর টিম walk('delete')একটি লুপে পণ্য লোড করার পরিবর্তে ব্যবহার করল না (যা আমরা সবাই জানি খুব খারাপ অভ্যাস)?

ভাল, আমরা এই ফোরামের অন্যান্য প্রশ্নগুলি থেকে নিম্নলিখিতগুলি জানি:

  • ম্যাজেন্টো কোডবেস বহু বছর ধরে বিকাশ ও বিকশিত হয়েছে
  • এটিতে এতে অনেক বিকাশকারী কাজ করে
  • তারা প্লাটফর্মে কাজ করার সময়কালের সাথে ম্যাজেন্টো কোর বিকাশের কর্মপ্রবাহ প্রক্রিয়াগুলি নাটকীয়ভাবে উন্নত হয়েছে, আধুনিক সেরা অনুশীলন এবং কৌশলগুলি অর্জন করেছে যেখানে ম্যাগেন্টো 2 এখন অনেকগুলি শীর্ষস্থানীয় আধুনিক অ্যাপ্লিকেশন ডিজাইনের অনুশীলন প্রদর্শন করে

সুতরাং আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি যে উদাহরণটি পেয়েছেন সম্ভবত সেই কোডটিতে লুকানো সম্ভাব্য অনেক রত্নগুলির মধ্যে একটি যা দীর্ঘকাল আগে লেখা হয়েছিল এবং / অথবা কোনও অভিজ্ঞ অভিজ্ঞ বিকাশকারী by মূল কোড (এবং সম্প্রদায়ের কোড!) এর মতো এটি একটি ছোট ডেটা সেটে পরীক্ষা করা হত এবং যুদ্ধের পরীক্ষা নাও করা হত, সুতরাং পারফরম্যান্সটি সম্ভবত নিবিড়ভাবে পর্যবেক্ষণ করা হয়নি।

আপনার উন্নতি কি উপকারী এবং মূল কোডের চেয়ে সেরা অনুশীলনে আরও ঘনিষ্ঠভাবে সংযুক্ত? হ্যাঁ. একটি সম্প্রদায় হিসাবে Magento [1.x] বিকাশকারী যদিও প্রস্তাবিত উন্নতিতে অবদান রাখার মতো ক্ষমতা রাখে না যদিও আপনি Magento 2 এর সাথে করেছেন, সুতরাং আমার পরামর্শটি আপনার স্থানীয় স্টোরের কোনওটিতে পারফরম্যান্সের জন্য প্রয়োজন হলে এটি স্থানীয় মডিউলে প্রয়োগ করা হবে my , বা এটি যদি আপনার উপর প্রভাব ফেলছে না তবে এটিকে এড়িয়ে যান তবে কিছু গবেষণা করার সময় আপনি এটি লক্ষ্য করেছেন।

আপনার প্রশ্ন সম্পাদনার আপডেট হিসাবে, আমি নিশ্চিত যে আপনি ওয়্যারিয়ান_ডাটা_ক্লোকশনের ওয়াক পদ্ধতিটি একটি স্বেচ্ছাসেবীর কলব্যাক গ্রহণ করেন, তাই আপনি যা চান তা চাইলে আপনি এটি ব্যবহার করতে মুক্ত হন। আসল উদাহরণে ইভেন্টটি প্রেরণের জন্য আপনি ওয়াক ফাংশনটি পাশাপাশি মুছতে পারেন।

কেবলমাত্র আমি কল্পনা করতে পারি যে পণ্যটি মুছে ফেলার আগে এটি লোড করা কার্যকর হবে তা হ'ল এই ইভেন্টের সাথে যুক্ত পর্যবেক্ষকদের প্রথমে পণ্য লোড না করে একটি সম্পূর্ণ ডেটা সেটের প্রয়োজন থাকতে পারে। যদি এটি হয় তবে এটি ব্যাখ্যা করবে যে তারা কেন কমপক্ষে অবজেক্টের ওভারহেডগুলি ন্যূনতম করার জন্য মডেলটির চেয়ে সিঙ্গলটন ব্যবহার করে।


ধন্যবাদ আমি পোস্টে ফলাফলের আগে এবং পরে যুক্ত করেছি। সুতরাং আপনি কি ভাবেন যে এটি পুরাতন কোডটি বাদে কোনও বিশেষ কারণ নেই?
রাফেল ডিজিটাল পিয়ানোবাদ

2
এটা আমার অনুমান হবে, হ্যাঁ। পণ্য মোছার আগে এটি লোড করা লোড ইভেন্টগুলিকে ছড়িয়ে দেওয়া ছাড়া অন্য কোনও উপকারে আসবে না, যা মোছার জন্য প্রাসঙ্গিক নয়। সাধারণত আপনি কোনও পণ্যটির সম্পূর্ণ ডেটা সেট অর্জনের জন্য লোড করেন, যা ইভেন্টের সাথে যুক্ত কোনও পর্যবেক্ষকের জন্য প্রয়োজন হতে পারে - যদি এমন হয় তবে এটি ব্যাখ্যা করবে যে তারা মডেলের পরিবর্তে কেন সিঙ্গলটন ব্যবহার করছেন।
রবি অ্যাভারিল

1
আরও পরীক্ষা সহ আমার সম্পাদনা দেখুন, ফলাফলগুলি আরও
ক্রেজিয়ার

0

আমার চিন্তাভাবনাটি হ'ল তারা catalog_controller_product_deleteইভেন্টটিকে আগুন জ্বালানোর জন্য করছে যা ম্যাজ_ট্যাগ দ্বারা ব্যবহৃত হচ্ছে।

catalog_product_delete_beforeবা catalog_product_delete_afterআমি ভাবতে চাইলেও এটি অপ্রয়োজনীয় ছিল। যদি এই নির্দিষ্ট ইভেন্টটি প্রশাসনের অ্যাকশন লগিংয়ের জন্যও ব্যবহৃত হয় তবে অবাক হন।


তাও আবার সম্পর্কে চিন্তা কিন্তু যে স্পষ্টভাবে কারণে এটি ঘটে না massDelete()কর্মCustomerController.php
ডিজিটাল Pianism এ রাফায়েল

আরও পরীক্ষা সহ আমার সম্পাদনা দেখুন, ফলাফলগুলি আরও
ক্রেজিয়ার

0

আমি মনে করি ভর-মুছতে কোনও একক (সম্পূর্ণ বোঝা) পণ্য মোছার মতো কাজ করা উচিত।

জন্য $collection->delete()উত্তর ইতিমধ্যে দেওয়া হয়। আপনি ট্রিগার না থাকে deleter_before, delete_afterআমি সম্ভবত কিছু এক্সটেনশান ভাঙতে পারে এবং কোর ব্যবহৃত কিছু পর্যবেক্ষক বাইপাস করবে।

$collection->walk('delete')সম্ভবত কাজ করতে পারে, তবে এখনও পণ্যটির ডেটা সম্পূর্ণ না হওয়ার অসুবিধা রয়েছে। কাস্টম পর্যবেক্ষকরা যদি অতিরিক্ত ডেটার উপর নির্ভর করে তবে এটি স্টক আইটেম অবজেক্টকেও ভেঙে ফেলতে পারে।

আমি, আপনি যদি পরিবর্তন ->addAttributeToSelect('entity_id')করতে ->addAttributeToSelect('*')যোগ ->setFlag('require_stock_items', true)(পণ্য স্টক তথ্য যোগ করার জন্য) এটা ভাল তারপর "লুপ-মুছে দিন" সঞ্চালন করা হবে না।

খারাপ স্টাইলের মতো দেখায়, তবে আমি মনে করি এটি গণ-মোছা ক্রিয়া উভয়ের জন্যই সঠিক।

আমি ব্যবহার করি walk()এবং delete()কাস্টম মডেলগুলির জন্যও, তবে আমি জানি যে কোনও পর্যবেক্ষক নেই বা entity_idযথেষ্ট। কেবল উল্লেখ করার জন্য, walk()মূল ব্যবহৃত সমস্ত ইভেন্টগুলির সাথে কাজ করবে, কারণ সেগুলি কেবলমাত্র ব্যবহৃত হয় $product->getId(), তবে আপনি তৃতীয় পক্ষের পর্যবেক্ষকদের সম্পর্কে জানেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.