Domanda

Questa domanda è stata un po 'senza risposta per me per un po' ora, e vorrei ottenere una risposta definitiva da qualcuno su come funziona.

Scenario:

Esecuzione di Magento 1.14.2.1, Ho impostato tutti i miei indicizzatori da eseguire in programma e eseguo il Magento Cron che esegue enterprise_refresh_index ogni volta che qualsiasi cosa deve essere parzialmente (o completamente?) Indicizzata.

Prima dell'aggiornamento a questa versione, stavo eseguendo 1.13.1 e non stava usando il cron. Ho avuto indicizzatori impostati per essere su salva e quando avevo bisogno di forzare uno qualsiasi degli indicizzatori da eseguire, lo farò tramite shell/indexer.php o utilizzando il seguente esempio di codice:

// Example of indexers passed in:
$indexers = ['catalog_product_flat', 'catalog_category_flat'];

foreach ($indexers as $code) {
    $process = Mage::getSingleton('index/indexer')
                   ->getProcessByCode($code)
                   ->reindexEverything();
}
.

In precedenza ...

Questo ha funzionato bene in precedenza in termini di avere gli indicizzatori che corrono immediatamente quando li vogliono e avere le varie modifiche richieste di propagarsi relativamente rapidamente al frontend, ecc.

Ovviamente siamo entrati in problemi di deadlock / lock table e indicizzatori in conflitto con ciascuno-altro quando abbiamo avuto più utenti di amministratori di risparmiare prodotti ecc. Allo stesso tempo, quindi la nostra mossa alla nuova "Best Practice" di utilizzare il MAGENTO CRON da gestire Tutto in programma.

Le mie domande:

    .
  1. Come sostituisci il vecchio stile di forzare un prodotto Flat Reindex (php shell/indexer.php --reindex catalog_product_flat) con l'equivalente ora attraverso il lavoro di cron programmato? Tutto quello che posso vedere è che è possibile eseguire il lavoro di cron di enterprise_refresh_index, ma che gestisce tutti gli indicizzatori destra - nessuna capacità di individuare determinate parti?
  2. è anche pertinente per necessità di farlo altro? Con questo intendo che facendo il comando precedente, potrei continuare a indossare solo ciò che doveva essere necessario all'interno del regno piano del prodotto del catalogo, e eseguendo l'attività programmata che fa la stessa cosa, ma combina tutti gli indicizzatori in uno? Se questo è il caso, va bene - è solo abbastanza confuso da capire.
  3. Sfondo:

    Ho posto questa domanda con il supporto Magento EE. Sono tornati a dire che cade al di fuori del regno degli accordi di sostegno, ma ha ancora una risposta da uno dei Devs Magento e mi ha risposto dicendo che "le modifiche al database vengono rilevate con trigger e hanno creato i record di Changelog." Capisco che da qui, l'indicizzatore programmato decide cosa deve essere fatto in base a quei record di Changelog.

    In precedenza ho assunto che se avessi bisogno di reindicizzare le tabelle piatte del prodotto (tutti i prodotti, tutto), lo farei dalla riga di comando come l'esempio precedente. Come faccio a raggiungere la stessa cosa ora se sarà solo reindici, quelli che conosce dovrebbero essere fatti tramite Changelogs? C'è un modo per reindici Tutto del prodotto Dati piatti senza catturare tutti gli altri indicizzatori con esso tramite enterprise_refresh_index?

    Non penso che sia pertinente, ma usiamo il modulo Aoe_scheduler per dare una migliore intuizione di ciò che sta facendo il cron.


    .

    So che è lungo. Per favore fatemi sapere se posso riassumere un po 'meglio. Non ho avuto fortuna per ottenere una risposta definitiva, e alcuni utenti amministrativi non sono convinti che il Magento Cron stia reinducendo tutto efficacemente ogni volta. Quando viene effettuato questo tipo di dichiarazione, normalmente reindicizzerei tutti i dati piatti del prodotto da CLI, ma non posso più farlo perché provoca conflitti con l'indicizzatore programmato e tutto l'inferno si allenta.

È stato utile?

Soluzione

public function refreshIndex(Mage_Cron_Model_Schedule $schedule)
{
    /** @var $helper Enterprise_Index_Helper_Data */
    $helper = Mage::helper('enterprise_index');

    /** @var $lock Enterprise_Index_Model_Lock */
    $lock   = Enterprise_Index_Model_Lock::getInstance();

    if ($lock->setLock(self::REINDEX_FULL_LOCK)) {

        /**
         * Workaround for fatals and memory crashes: Invalidating indexers that are in progress
         * Successful lock setting is considered that no other full reindex processes are running
         */
        $this->_invalidateInProgressIndexers();

        $client = Mage::getModel('enterprise_mview/client');
        try {

            //full re-index
            $inactiveIndexes = $this->_getInactiveIndexersByPriority();
            $rebuiltIndexes = array();
            foreach ($inactiveIndexes as $inactiveIndexer) {
                $tableName  = (string)$inactiveIndexer->index_table;
                $actionName = (string)$inactiveIndexer->action_model->all;
                $client->init($tableName);
                if ($actionName) {
                    $client->execute($actionName);
                    $rebuiltIndexes[] = $tableName;
                }
            }

            //re-index by changelog
            $indexers = $helper->getIndexers(true);
            foreach ($indexers as $indexerName => $indexerData) {
                $indexTable = (string)$indexerData->index_table;
                $actionName = (string)$indexerData->action_model->changelog;
                $client->init($indexTable);
                if (isset($actionName) && !in_array($indexTable, $rebuiltIndexes)) {
                    $client->execute($actionName);
                }
            }

        } catch (Exception $e) {
            $lock->releaseLock(self::REINDEX_FULL_LOCK);
            throw $e;
        }

        $lock->releaseLock(self::REINDEX_FULL_LOCK);
    }

    return $this;
}
.

Questo funziona "sempre" su ogni esecuzione di cron. Esegue ri-indicizzi completi per gli indici necessari ed elabora il Changelog per quelli che non lo fanno.

Inoltre, è comunque possibile eseguire gli script Shell CLI, ma non considerà il Changelog parziale e faranno ciecamente un Reindex completo.

Se si ottiene le serrature morte, è possibile impostare tutti i tuoi indicizzatori su Manual e configurazione dei processi alternativi per ricostruire l'indice alle ore di tempo libero (quando gli amministratori sono via). Solo Prezzi del prodotto e Status Stock dovrebbe essere impostato su Aggiorna su Salva.

Tieni presente che con stato di ri-indicizzazione parziale nella tabella index_process non viene più utilizzata ma calcolata da enterprise_mview_metadata.

La disabilitazione di alcuni moduli interni come Mage_Rss può anche aiutare a impatto sulla frequenza di invalidazione degli indici.

Ulteriore lettura:

Altri suggerimenti

Da parte, ho recentemente incontrato il aoe_eeindexerstats Modulo da Aoepeople su GitHub - da un rapidoSguardo Sembra che ti consentirà di controllare determinate parti degli indicizzatori o di interi indicizzatori, che sono tutti coperti sotto enterprise_refresh_index.Ciò sarebbe potenzialmente un equivalente al processo precedente, in cui è possibile indirizzare l'indice catalog_product_flat da solo.

Dovrebbe anche essere accessibile nel codice come tale:

$client = Mage::getModel('enterprise_mview/client'); /* @var $client Enterprise_Mview_Model_Client */
$client->initByTableName($tablename);
$metadata = $client->getMetadata();
$metadata->setInvalidStatus();
$metadata->save();
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top