ম্যাজেন্টো 2 এ ম্যুভিউ কী?


28

সবার আগে আমি যা জানি:

সূচক পরিচালনা স্টোরের কার্যকারিতা বাড়ানোর জন্য কার্যকর।

EAV এর একটি অসুবিধা রয়েছে it এটি বিভিন্ন টেবিলগুলিতে ডেটা সঞ্চয় করবে so তাই তথ্য পুনরুদ্ধার করা সময়সাপেক্ষ।

যাতে আমরা একক টেবিলের মধ্যে ডেটা সংরক্ষণ করব। যখন ডেটা পরিবর্তন করা হবে আমরা এই একক টেবিলটি আপডেট করব (ইনডেক্সিং আপডেট ছাড়া কিছুই নয়)

mysql trigger: কিছু সারণী সন্নিবেশ / আপডেট / মোছার উপর ভিত্তি করে কিছু ক্যোয়ারী ক্রিয়া সম্পাদন করুন।

সুতরাং ম্যাজেন্টো উদাহরণস্বরূপ ট্রিগার ব্যবহার করে যখন মূল্য আপডেট হয় এটি চেঞ্জলগ entity_idটেবিলের মধ্যে সংরক্ষণ করবে ।

ট্রিগারগুলি ম্যাজেন্টো 2 ব্যবহার করে প্রয়োগ করার জন্য ডেভডোকসে একটি বিবৃতি রয়েছে Magento/Framework/Mview

আপনি যে কেউ এই কার্যকারিতা প্রবাহ ব্যাখ্যা করতে পারেন?

মানে কি view, action, processorইত্যাদি?


2
প্রবাহ সম্পর্কে নিশ্চিত নয়, তবে বস্তুগত দর্শনগুলিকেMview বোঝায় , যা সূচক টেবিলগুলি।
নেভভারমাইন্ড

উত্তর:


55

অফিসিয়াল ডকুমেন্টেশনে: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html এখানে স্টিমেন্ট রয়েছে:

`Allows tracking database changes for a certain entity (product, category and so on) and running change handler.
Emulates the materialized view technology for MySQL using triggers and separate materialization process (provides executing PHP code instead of SQL queries, which allows materializing multiple queries).`

এমভিউ মানে মেটেরালাইজড ভিউ যা সময়ে সময়ে একটি ডাটাবেসের স্ন্যাপশট। https://en.wikedia.org/wiki/Materialized_view কেন আমাদের টেবিলগুলি নকল করতে হবে। সূচকগুলি চালানো ব্যয়বহুল, বিশেষত যখন বিভাগের পৃষ্ঠাগুলিতে ট্র্যাফিক থাকে, গ্রাহকরা অর্ডার এবং প্রশাসকদের পণ্য সংরক্ষণ করে। পণ্য সংরক্ষণে ক্যাশে অবৈধ হয়ে যায় (বিষয় ছাড়াই)। স্টক ইনডেক্সারের ক্ষেত্রে, মৃত্যুদন্ড কার্যকর হওয়ার আগে, এটি ক্যাশে ট্যাগগুলি প্রভাবিত সত্তা আইডিগুলি পরিষ্কার করার জন্য প্রেরণ করে (পূর্ণ পৃষ্ঠা ক্যাশে প্রকার)। ম্যাজেন্টো ২.০ বিভাগে ক্রয়কৃত পণ্যগুলির আইডি প্রেরণ করা হয়। ম্যাজেন্টো ২.১ এ পণ্য আইডি প্রেরণ করা হয়।

এখানে 2 টি মাইএসকিউএল টেবিল রয়েছে যা সূচক কোড এবং স্থিতিগুলি রাখে:

  • indexer_state
  • mview_state

mview_stateসাথে কাজ করে Update by Scheduleএডমিন> সিস্টেম> Indexer ম্যানেজমেন্ট

Update by Schedule সূচকদের ক্রোন চালানো হয়।

এখানে 3 টি এন্ট্রি রয়েছে Magento_Indexer/etc/contab.xml:

<group id="index">
    <job name="indexer_reindex_all_invalid" instance="Magento\Indexer\Cron\ReindexAllInvalid" method="execute">
        <schedule>* * * * *</schedule>
    </job>
    <job name="indexer_update_all_views" instance="Magento\Indexer\Cron\UpdateMview" method="execute">
        <schedule>* * * * *</schedule>
    </job>
    <job name="indexer_clean_all_changelogs" instance="Magento\Indexer\Cron\ClearChangelog" method="execute">
        <schedule>0 * * * *</schedule>
    </job>
</group>
  • indexer_reindex_all_invalidউপর চালানো হয় indexer_state। ক্রোনটিতে এখনও 'নরমাল' ইনডেক্সার চালানোর দরকার আছে
  • indexer_update_all_views চালানো হয় mview_state
  • indexer_clean_all_changelogs - দ্বারা ব্যবহৃত চেঞ্জলগগুলি সাফ করে mview_state

লক্ষ্য করুন ক্রন indexer দলের কাজের, যেমন ঘোষণা পৃথক পিএইচপি প্রক্রিয়ায় দেশ পরিচালিত etc/contab_groups.xml: <use_separate_process>1</use_separate_process>

চেঞ্জলগ টেবিলগুলি হ'ল: [indexer name]_cl(প্রত্যয়যুক্ত _cl)। যেমন cataloginventory_stock_cl। আপনার যদি সূচকগুলি সেট করে থাকে Update by Scheduleএবং প্রশাসকে কোনও পণ্য সংরক্ষণ করে থাকেন তবে entity_idআপনি এই টেবিলটিতে সেই পণ্যটি দেখতে পাবেন । এটি একটি বড় চেনাশোনা, আমি জায়গা অর্ডার ভাবছি বা চালান তৈরি করা এখানেও একটি এন্ট্রি যুক্ত করবে।

কেউ কীভাবে নতুন বস্তুগত দৃষ্টিভঙ্গি তৈরি করবেন এবং ইন্টারফেস পদ্ধতিগুলি কী কী প্রয়োজন (স্নিপেট বেলোতে অর্ডার সম্পর্কে উপরের বিবৃতিটি উপেক্ষা করুন) সম্পর্কে অফিসিয়াল ডিডোকের উদাহরণ দিয়েছেন:

<?php
<VendorName>\Merchandizing\Model\Indexer;
class Popular implements \Magento\Framework\Indexer\ActionInterface,   \Magento\Framework\Mview\ActionInterface
{
public function executeFull(); //Should take into account all placed orders in the system
public function executeList($ids); //Works with a set of placed orders (mass actions and so on)
public function executeRow($id); //Works in runtime for a single order using plugins
public function execute($ids); //Used by mview, allows you to process multiple placed orders in the "Update on schedule" mode
}

এটি অর্থবোধ করবে: //public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode } যেখানে $idsপ্যারামিটারে *_clসারণীগুলি থেকে সত্তা আইডি রয়েছে ।

ক্যাশে অবৈধকরণ এবং সূচকগুলির মধ্যে লিঙ্কটি কী। বিভাগ পৃষ্ঠাতে এখন সম্পূর্ণ পৃষ্ঠা ক্যাশেড (অন্তর্নির্মিত পূর্ণ পৃষ্ঠা ক্যাশে বা বার্নিশের মাধ্যমে)।

আছে \Magento\Indexer\Model\Processor\InvalidateCache::afterUpdateMview:

/**
 * Update indexer views
 *
 * @param \Magento\Indexer\Model\Processor $subject
 * @return void
 * @SuppressWarnings(PHPMD.UnusedFormalParameter)
 */
public function afterUpdateMview(\Magento\Indexer\Model\Processor $subject)
{
    if ($this->moduleManager->isEnabled('Magento_PageCache')) {
        $this->eventManager->dispatch('clean_cache_after_reindex', ['object' => $this->context]);
    }
}

ফিরে Magento\Indexer\Cron\UpdateMview::execute():

/**
 * Regenerate indexes for all invalid indexers
 *
 * @return void
 */
public function execute()
{
    $this->processor->updateMview();
}

Magento\Indexer\Model\Processor::updateMview():

/**
 * Update indexer views
 *
 * @return void
 */
public function updateMview()
{
    $this->mviewProcessor->update('indexer');
}

ইন app/etc/di.xmlথাকে:

<preference for="Magento\Framework\Mview\ProcessorInterface" type="Magento\Framework\Mview\Processor" />


/**
 * Materialize all views by group (all views if empty)
 *
 * @param string $group
 * @return void
 */
public function update($group = '')
{
    foreach ($this->getViewsByGroup($group) as $view) {
        $view->update();
    }
}

Magento\Framework\Mview\ViewInterface

/**
 * Materialize view by IDs in changelog
 *
 * @return void
 * @throws \Exception
 */
public function update();

app/etc/di.xml

 <preference for="Magento\Framework\Mview\ViewInterface" type="Magento\Framework\Mview\View" />

ইন Magento\Framework\Mview\View::update()থাকে:

$action = $this->actionFactory->get($this->getActionClass());
$this->getState()->setStatus(View\StateInterface::STATUS_WORKING)->save();
..
$action->execute($ids);
..

আপনি যদি vendor/ডিরেক্টরিতে অনুসন্ধান করেন তবে Magento\Framework\Mview\ActionInterfaceউদাহরণস্বরূপ এটি পাবেন:

ইন \Magento\CatalogInventory\Model\Indexer:

class Stock implements \Magento\Framework\Indexer\ActionInterface, \Magento\Framework\Mview\ActionInterface

এই শ্রেণিতে আছে:

/**
 * Execute materialization on ids entities
 *
 * @param int[] $ids
 *
 * @return void
 */
public function execute($ids)
{
    $this->_productStockIndexerRows->execute($ids);
}

এবং দেখে মনে হচ্ছে এটি 'সাধারণ' সূচকের 'ক্লাসে চলে গেছে' এক্সিকিউটিভ পদ্ধতি যা এমভিউ দ্বারা ব্যবহৃত হয়।

স্টক সূচক পরে ক্যাশে পরিষ্কার সম্পর্কে । যখন চেকআউটে কোনও অর্ডার দেওয়া হয়, তখন এই পর্যবেক্ষককে ব্যবহার করে পরিমাণগুলি বিয়োগ করা হয়:\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver

$itemsForReindex = $this->stockManagement->registerProductsSale(
    $items,
    $quote->getStore()->getWebsiteId()
);

আরও, অন্য পর্যবেক্ষক সূচককে ট্রিগার করে (তবে সিডিউল অনুসারে এমভিউ / ইনডেক্সারে সরাসরি নয়): \Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver

if ($productIds) {
    $this->stockIndexerProcessor->reindexList($productIds);
}

মিউউ ক্ষেত্রে, যখন নতুন পরিমাণগুলি বিয়োগ করা হয় SubtractQuoteInventoryObserver, তখন মাইএসকিউএল ট্রিগার (এমভিউর জন্য তৈরি) একটি সারি সন্নিবেশ করবে cataloginventory_stock_cl, চিহ্নিত করে যে সেই ক্রয়কৃত পণ্যের আইডিতে একটি রিইন্ডেক্স (স্টক এবং ফুলটেক্সট) করা দরকার। এমভিউর জন্য অনেকগুলি মাইএসকিউএল ট্রিগার তৈরি করা হয়েছে। তাদের সাথে সমস্ত দেখুন SHOW TRIGGERS;

যখন কোনও পণ্য চেকআউট করার পরে স্টক থেকে বেরিয়ে যায় আপনি সেই টেবিলটিতে 2 সারি sertedোকানো দেখতে পাবেন (ম্যাজেন্টো এই 2 পর্যবেক্ষকের মধ্যে 2 বার স্টক আইটেমটি সংরক্ষণ করে)।

ক্রোন যখন মভিউ মোডে স্টক সূচকটি চালায় তখন প্রভাবিত পণ্য আইডিগুলি (এম 2.1 এ) বা বিভাগ আইডির (এম 2.0 এ) ক্যাশে ট্যাগ হিসাবে ক্যাশে পরিষ্কার প্রেরণ করা হয়। ক্যাশে দ্বারা আমি সম্পূর্ণ পৃষ্ঠার ক্যাশে প্রকারের অর্থ। উদাহরণ: catalog_product_99বা অন্যান্য ক্যাশে ট্যাগ ফর্ম্যাটটি ম্যাজেন্টো সংস্করণের উপর নির্ভর করে। যখন ভিউ সক্ষম করা থাকে না তখন একই।

\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows

...
$this->eventManager->dispatch('clean_cache_by_tags', ['object' => $this->cacheContext]);

এবং ম্যাজেন্টো_প্যাজক্যাচে এমন পর্যবেক্ষক রয়েছে \Magento\PageCache\Observer\FlushCacheByTagsযা পুরো পৃষ্ঠা ক্যাশে প্রকারের ট্যাগগুলি সাফ করবে। এটি বিল্ট-ইন পুরো পৃষ্ঠা ক্যাশে করার জন্য এটি করে। বার্নিশ সম্পর্কিত কোড রয়েছে \Magento\CacheInvalidate\Observer\InvalidateVarnishObserver

একটি নিখরচায় এক্সটেনশন রয়েছে যা গ্রাহক চেকআউট করার পরেও স্টক পণ্যগুলিতে ক্যাশে পরিষ্কার অস্বীকার করবে:

https://github.com/daniel-ifrim/innovo-cache-improve

ডিফল্ট ম্যাজেন্টো ২.২.x সালে চেকআউট চালু হওয়ার পরে কেবল স্টক পণ্যগুলির বাইরে ক্যাশে পরিষ্কার করা দেখুন \Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner

আমি ভাবছি ইনডেক্সারের জন্য ক্রোন এক্সিকিউশনটি Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index1 মিনিটেরও বেশি সেট করা উচিত।


6

mview.xmlসহ ব্যবহার করা হয় indexer.xmlসেটআপ indexers করতে।

mview.xmlফাইল ঘোষণা:

  • সূচক দেখার আইডি
  • সূচক শ্রেণি
  • ডাটাবেস সূচক ট্র্যাক টেবিল
  • সূচককে কী কলামের ডেটা প্রেরণ করা হয়

indexer.xmlফাইল ঘোষণা:

  • সূচক আইডি
  • সূচক শ্রেণীর নাম
  • সূচক শিরোনাম
  • সূচক বর্ণনা
  • সূচক দেখার আইডি

আপনি এখানে কাস্টম সূচক ঘোষণা সম্পর্কে আরও তথ্য পেতে পারেন: Magento2 এ কাস্টম সূচক

আমি যা বুঝতে পেরেছি তা থেকে এখানে দুটি আলাদা জিনিস রয়েছে:

  • Magento_Indexerমডিউল থেকে সূচক
  • ট্রিউগারগুলি Magento\Framework\Mviewব্যবহার করে মাইএসকিউএল-র জন্য বস্তুগত দর্শনটি এমুলেট করে এমন মভিউ ।

অফিসিয়াল ডকুমেন্টেশন থেকে এখানে কিছু আলোকিত তথ্য রয়েছে

সূচক প্রকারের

প্রতিটি সূচক নিম্নলিখিত ধরণের পুনর্নির্দেশ অপারেশন করতে পারে:

  • ফুল রিইনডেক্স, যার অর্থ ইনডেক্স-সম্পর্কিত সমস্ত ডাটাবেস সারণী পুনর্নির্মাণ।

  • একটি নতুন ওয়েব স্টোর বা নতুন গ্রাহক গোষ্ঠী তৈরি করা সহ বিভিন্ন জিনিস দ্বারা সম্পূর্ণ রিইন্ডেক্সিংয়ের কারণ হতে পারে। আপনি কমান্ড লাইনটি ব্যবহার করে যে কোনও সময় fullyচ্ছিকভাবে পুরোপুরি পুনর্নির্মাণ করতে পারেন।

  • আংশিক পুনর্নির্দেশ, যার অর্থ কেবল পরিবর্তিত জিনিসের জন্য ডাটাবেস টেবিলগুলি পুনঃনির্মাণ করা (উদাহরণস্বরূপ, একক পণ্য বৈশিষ্ট্য বা দাম পরিবর্তন করা)।

প্রতিটি বিশেষ ক্ষেত্রে পুনর্নির্দেশের ধরণটি অভিধানে বা সিস্টেমে যে পরিবর্তনগুলি করা হয়েছে তার উপর নির্ভর করে। এই নির্ভরতা প্রতিটি সূচক জন্য নির্দিষ্ট।

ওয়ার্কফ্লো সম্পর্কিত, এখানে এটি আংশিক পুনর্নির্মাণের জন্য:

এখানে চিত্র বর্ণনা লিখুন


1
ডকুমেন্টেশনে একটি বাগ রয়েছে। github.com/magento/magento2/issues/4658
শিবকুমার কে

6

ম্যাজেন্টো নথি থেকে রেফারেন্স ইতিমধ্যে এখানে তাই আমি সেই অংশটি এড়িয়ে চলেছি।
ম্যাজেন্টো ২.০ তে বস্তুগত দৃষ্টিভঙ্গি প্রয়োগ করেছে যা সমস্ত সূচকগুলির জন্য পরিবর্তনগুলি ট্র্যাক করে। প্রতিটি সূচকের একটি _clটেবিল থাকে যা পায় entity_idএবং auto_increment version_idমূল টেবিলগুলিতে একটি ট্রিগার যুক্ত হয়।
ক্রোন জব যখন কার্যকর হয়, তখন সূচক টেবিল version_idথেকে প্রতিটি দেখার জন্য শেষ হয় mview_stateএবং সারণীতে পরবর্তী উপলভ্য সত্তা সূচক হয় _cl
পুনর্নির্মাণটি 1.9.xx পর্যন্ত মাথাব্যথা ছিল এবং বিশাল ক্যাটালগ সহ এটি সর্বদা সিস্টেমকে ধীর করে দেয়।
ম্যাজেন্টো ২.০ ইনডেক্সারে সম্পূর্ণ ডেটা পুনরায় সূচনা করার পরিবর্তে সূচক টেবিলগুলিতে নির্দিষ্ট সত্তার তথ্যটি কেবল আপডেট করে। এটি সার্ভারকে ধীর না করে বল ঘূর্ণায়মান রাখে।
দ্রষ্টব্য: ম্যাটারিওলাইজ ভিউ মাইএসকিএলে সমর্থিত নয় তাই ম্যাজেন্টোতে, এটি পিএইচপি কোড দ্বারা পরিচালিত হয় এবং এটি মেটেরালাইজড ভিউয়ের মতো কাজ করে যা ওরাকলের মতো এন্টারপ্রাইজ স্তরের ডিবিএমএসের বৈশিষ্ট্য।


"ম্যাজেন্টো 2.0 তে বস্তুগত দৃষ্টিভঙ্গি প্রয়োগ করেছে" - আসলে এটি কিছুক্ষণের জন্য ম্যাজেন্টো 1 ইইতে রয়েছে
রবি অ্যাভারিল

"ম্যাজেন্টো ২.০ ইনডেক্সারে সম্পূর্ণ ডেটা পুনরায় সূচনা করার পরিবর্তে সূচক টেবিলগুলিতে নির্দিষ্ট সত্তার তথ্যটি কেবল আপডেট করে।" - আবারও, আংশিক পুনর্নির্মাণটি ম্যাজেন্টো 1 তেও বিদ্যমান
রবি অ্যাভারিল

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