आधिकारिक दस्तावेज़ीकरण में:
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).`
MView का मतलब है Materialized View जो कि एक बिंदु पर डेटाबेस का एक स्नैपशॉट है।
https://en.wikipedia.org/wiki/Materialized_view
हमें तालिकाओं को डुप्लिकेट करने की आवश्यकता क्यों होगी। इंडेक्सर्स को चलाना महंगा पड़ता है, खासकर जब श्रेणी के पन्नों पर ट्रैफिक होता है, तो ग्राहक ऑर्डर देते हैं और उत्पादों को बचाते हैं। उत्पाद को सहेजने पर कैश अमान्य (ऑफ विषय) हो जाता है। स्टॉक इंडेक्सर के मामले में, निष्पादन समाप्त होने से पहले, यह कैश आईडी के रूप में प्रभावित इकाई आईडी को साफ करने के लिए भेजता है (पूर्ण पृष्ठ कैश कार्ड)। Magento 2.0 श्रेणियों में खरीदे गए उत्पादों के आईडी भेजे जाते हैं। Magento 2.1 में उत्पाद आईडी भेजे जाते हैं।
2 MySQL टेबल हैं जो इंडेक्स कोड और स्टेटस रखते हैं:
indexer_state
mview_state
mview_state
Update by Schedule
व्यवस्थापक> प्रणाली> अनुक्रमणिका प्रबंधन के साथ काम करता है
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
ध्यान दें कि क्रॉन इंडेक्सर ग्रुप टास्क, के रूप में घोषित किये गए एक अलग php प्रक्रिया में चलाने 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);
}
और ऐसा लग रहा है कि यह वापस 'सामान्य' वर्ग के इंडेक्सर्स 'निष्पादित' विधि का उपयोग करता है जो कि MView द्वारा उपयोग किया जाता है।
स्टॉक इंडेक्सर के बाद कैश सफाई के बारे में । जब एक आदेश चेकआउट पर रखा जाता है, तो इस पर्यवेक्षक का उपयोग करके मात्राएँ घटा दी जाती हैं:\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver
$itemsForReindex = $this->stockManagement->registerProductsSale(
$items,
$quote->getStore()->getWebsiteId()
);
इसके अलावा, एक और प्रेक्षक अनुक्रमणिका चलाता है (लेकिन सीधे Mview / अनुक्रमक पर अनुसूची द्वारा नहीं):
\Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver
if ($productIds) {
$this->stockIndexerProcessor->reindexList($productIds);
}
Mview के मामले में, जब नई मात्रा को घटाया जाता है SubtractQuoteInventoryObserver
, तो MySQL ट्रिगर (Mview के लिए बनाई गई) में एक पंक्ति सम्मिलित होगी cataloginventory_stock_cl
, जो यह चिन्हित करेगी कि उन खरीदी गई उत्पाद आईडी के लिए एक reindex (स्टॉक और फुलटेक्स्ट) की आवश्यकता है। Mview के लिए कई MySQL ट्रिगर बनाए गए हैं। उन सभी के साथ देखें SHOW TRIGGERS;
।
जब चेकआउट के बाद कोई उत्पाद स्टॉक से बाहर हो जाता है, तो आपको उस तालिका में 2 पंक्तियाँ दिखाई देंगी (Magento इन 2 वेधशालाओं में 2 गुना स्टॉक आइटम बचाता है)।
जब क्रोन Mview मोड में स्टॉक इंडेक्सर चलाता है तो प्रभावित उत्पाद आईडी (M2.1 में) या श्रेणियां आईडी (M2.0 में) कैश टैग के रूप में साफ करने के लिए भेजे जाते हैं। कैशे द्वारा मेरा मतलब है फुल पेज कैश टाइप। उदाहरण: catalog_product_99
या Magento के संस्करण के आधार पर अन्य कैश टैग प्रारूप। वही जब Mview सक्षम नहीं है।
\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows
...
$this->eventManager->dispatch('clean_cache_by_tags', ['object' => $this->cacheContext]);
और Magento_PageCache में पर्यवेक्षक हैं \Magento\PageCache\Observer\FlushCacheByTags
जो टैग द्वारा पूर्ण पृष्ठ कैश प्रकार को साफ करेंगे। यह बिल्ट-इन फुल पेज कैश के लिए करता है। वार्निश संबंधित कोड में है \Magento\CacheInvalidate\Observer\InvalidateVarnishObserver
।
एक मुफ्त एक्सटेंशन है जो ग्राहक के चेकआउट के बाद भी स्टॉक उत्पादों में कैश को साफ करने से इनकार करेगा:
https://github.com/daniel-ifrim/innovo-cache-improve
डिफ़ॉल्ट रूप से Magento 2.2.x में चेकआउट की शुरुआत के बाद केवल स्टॉक उत्पादों में से कैशे की सफाई। देख लो \Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner
।
मुझे लगता है कि इंडेक्सर के लिए क्रॉन निष्पादन Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index
1 मिनट से अधिक समय के लिए सेट होना चाहिए।
Mview
को संदर्भित करता है , जो कि सूचकांक तालिकाएं हैं।