Resmi belgelerde:
https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html
stement var:
`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, belirli bir zamanda veritabanının anlık görüntüsü olan Materialized View anlamına gelir.
https://en.wikipedia.org/wiki/Materialized_view
Neden tabloları çoğaltmamız gerekiyor? Endeksleyiciler, özellikle kategori sayfalarında trafik olduğunda müşterilerin sipariş vermesi ve yöneticilerin ürünleri kurtarması için maliyetlidir. Ürüne kaydettiğiniz önbellek geçersiz hale gelir (konu dışı). Stok indeksleyicide, yürütmeyi bitirmeden önce, temizlenecek önbellek etiketleri olarak etkilenen varlık kimliklerini (tam sayfa önbellek türü) gönderir. Magento 2.0 kategorilerinde, satın alınan ürünlerin kimlikleri gönderilir. Magento 2.1'de ürün kimlikleri gönderilir.
Dizin oluşturucu kodlarını ve durumlarını tutan 2 MySQL tablosu vardır:
indexer_state
mview_state
mview_state
ile çalışır Update by Schedule
Yönetici> Sistem> Indexer Yönetiminde
Update by Schedule
İndeksleyicilerin cron cinsinden çalıştırılmasını sağlar.
İçinde 3 giriş var 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
çalıştırıldı indexer_state
. Cron'da 'normal' indeksleyicileri çalıştırmaya hala ihtiyaç var
indexer_update_all_views
çalıştırılır mview_state
indexer_clean_all_changelogs
- tarafından kullanılan değişmezleri temizler mview_state
Beyan olarak cron dizin grup görevleri ayrı php işleminde çalıştırmanızı Not etc/contab_groups.xml
:
<use_separate_process>1</use_separate_process>
.
Değişiklikler tabloları:
[indexer name]_cl
(ile sonlandırılmıştır _cl
). örn cataloginventory_stock_cl
. Update by Schedule
Bir ürünü yönetici olarak ayarlayıp kaydettiğinizde indeksleyiciniz varsa entity_id
, bu ürünün içindeki bu tabloyu göreceksiniz . Bu büyük bir çevre, bence yer emri veya gönderi oluştur buraya bir giriş ekleyecektir.
Birisi resmi devdoc'da yeni materyalize görüşler yaratmanın ve gerekli arayüz yöntemlerinin neler olduğuna dair bir örnek verdi (aşağıdaki kod parçasını aşağıdaki snippet'teki siparişlerle ilgili dikkate almayın):
<?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
}
Bu mantıklı olacaktır:
//public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode
}
Nerede $ids
parametrenin varlıklar kimlikleri *_cl
tablolardan.
Önbellek geçersiz kılma ve dizinleyiciler arasındaki bağlantı nedir. Kategoriler sayfaları artık tam sayfa önbelleğe alınmış (yerleşik tam sayfa önbelleği veya Cila ile).
Var \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]);
}
}
Geri dön 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');
}
Gelen app/etc/di.xml
vardır:
<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" />
Gelen Magento\Framework\Mview\View::update()
vardır:
$action = $this->actionFactory->get($this->getActionClass());
$this->getState()->setStatus(View\StateInterface::STATUS_WORKING)->save();
..
$action->execute($ids);
..
İçinde arama yaparsanız vendor/
için dizine Magento\Framework\Mview\ActionInterface
örneğin bunun için bulabilirsiniz:
İçinde \Magento\CatalogInventory\Model\Indexer
:
class Stock implements \Magento\Framework\Indexer\ActionInterface, \Magento\Framework\Mview\ActionInterface
Bu sınıfta:
/**
* Execute materialization on ids entities
*
* @param int[] $ids
*
* @return void
*/
public function execute($ids)
{
$this->_productStockIndexerRows->execute($ids);
}
Ve MView tarafından kullanılan 'normal' dizin oluşturucu sınıfı 'execute` yöntemine geri dönüyor gibi gözüküyor.
Stok Endeksleyiciden sonra önbellek temizliği hakkında . Ödeme emri alındığında, bu gözlemci kullanılarak miktarlar çıkarılır:\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver
$itemsForReindex = $this->stockManagement->registerProductsSale(
$items,
$quote->getStore()->getWebsiteId()
);
Ayrıca, başka bir gözlemci indeksleyiciyi tetikler (ancak doğrudan Programa göre Mview / Indexer'da değil):
\Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver
if ($productIds) {
$this->stockIndexerProcessor->reindexList($productIds);
}
Mview durumunda, yeni miktarlar çıkarıldığında SubtractQuoteInventoryObserver
, MySQL tetikleyicisi (Mview için yaratılmıştır) bir satır cataloginventory_stock_cl
ekleyerek satın alınan ürün kimlikleri için bir reindex (stok ve tam metin) yapılması gerektiğini işaretler. Mview için oluşturulan birçok MySQL tetikleyicisi var. Hepsini gör SHOW TRIGGERS;
.
Ödeme yapıldıktan sonra bir ürün stoktan çıktığında, bu tabloya 2 satır eklendiğini görürsünüz (Magento, bu 2 gözlemcide 2 kez stok kalemi kaydeder).
Cron, Mview modunda stok indeksleyiciyi çalıştırdığında, etkilenen ürün kimlikleri (M2.1'de) veya kategori kimlikleri (M2.0'da), önbellek etiketleri olarak temiz önbelleğe gönderilir. Önbellek ile tam sayfa önbellek türü demek istiyorum Örnek: catalog_product_99
veya Magento versiyonuna bağlı olarak diğer önbellek etiketi formatı. Mview etkin olmadığında da aynı.
\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows
...
$this->eventManager->dispatch('clean_cache_by_tags', ['object' => $this->cacheContext]);
Ve Magento_PageCache, \Magento\PageCache\Observer\FlushCacheByTags
tam sayfa önbellek türünü etiketlere göre temizleyecek bir gözlemciye sahiptir . Tam sayfa önbelleği oluşturmak için yapar. Vernikle ilgili kod var \Magento\CacheInvalidate\Observer\InvalidateVarnishObserver
.
Müşteri ödeme sonrasında hala stokta bulunan ürünlerde önbelleğin temizlenmesini engelleyen ücretsiz bir eklenti var:
https://github.com/daniel-ifrim/innovo-cache-improve
Magento 2.2.x varsayılan olarak kullanıma sunulduktan sonra yalnızca stoktaki ürünlerde önbellek temizliği. Bakın \Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner
.
İndeksleyici için cron uygulamasının Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index
1 dakikadan daha fazla ayarlanması gerektiğini düşünüyorum.
Mview
ifade eder .