Frage

Diese Frage ist für mich schon seit einiger Zeit einigermaßen unbeantwortet und ich würde gerne von jemandem eine definitive Antwort darüber bekommen, wie es funktioniert.

Szenario:

Wenn ich Magento 1.14.2.1 verwende, habe ich alle meine Indexer so eingestellt, dass sie nach Zeitplan ausgeführt werden, und ich führe den Magento-Cron aus, der ausgeführt wird enterprise_refresh_index wann immer etwas teilweise (oder vollständig?) indiziert werden muss.

Vor dem Upgrade auf diese Version habe ich 1.13.1 ausgeführt und den Cron nicht verwendet.Ich hatte Indexer aktiviert speichern, und wann immer ich die Ausführung eines Indexers erzwingen musste, tat ich dies entweder über shell/indexer.php oder verwenden Sie das folgende Codebeispiel:

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

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

Vorher...

Dies funktionierte zuvor gut, da die Indexer sofort ausgeführt wurden, wenn ich es wollte, und die verschiedenen erforderlichen Änderungen relativ schnell an das Frontend usw. weitergegeben wurden.

Offensichtlich stießen wir auf Probleme mit Deadlocks/Tabellensperren und miteinander in Konflikt stehende Indexer, wenn mehrere Admin-Benutzer gleichzeitig Produkte usw. speicherten. Aus diesem Grund haben wir uns für die neue „Best Practice“ entschieden, das Magento-Cron zu verwenden, um alles zu verwalten Zeitplan.

Meine Fragen:

  1. Wie ersetzen Sie den alten Stil, eine flache Neuindizierung eines Produkts zu erzwingen (php shell/indexer.php --reindex catalog_product_flat) mit dem Äquivalent jetzt durch den geplanten Cron-Job?Ich kann nur sehen, dass du rennen kannst enterprise_refresh_index Cron-Job, aber das geht alle Indexierer richtig – keine Möglichkeit, bestimmte Teile herauszusuchen?
  2. Ist es überhaupt relevant, dies noch tun zu müssen?Damit meine ich, dass Magento durch die Ausführung des vorherigen Befehls immer noch nur das indiziert hätte, was innerhalb des Katalogprodukt-Flat-Bereichs benötigt wurde, und dass es durch die Ausführung der geplanten Aufgabe das Gleiche tut, aber alle Indexer in einem vereint?Wenn dies der Fall ist, ist das in Ordnung – es ist nur ziemlich verwirrend zu verstehen.

Hintergrund:

Ich habe diese Frage mit dem Magento EE-Support gestellt.Sie kamen zurück, um zu sagen, dass es außerhalb des Bereichs der Unterstützungsvereinbarungen fällt, aber immer noch eine Antwort von einem der Magento -Entwickler erhielt und antwortete mir, dass "Änderungen an der Datenbank mit Triggern erkannt werden und Changelog -Aufzeichnungen erstellt werden". Ich verstehe, dass der geplante Indexer von hier aus entscheidet, was auf diesen Changelog -Aufzeichnungen erfolgen muss.

Bisher bin ich davon ausgegangen, dass ich, wenn ich die flachen Produkttabellen (alle Produkte, alles) neu indizieren muss, dies wie im vorherigen Beispiel über die Befehlszeile tun würde.Wie kann ich jetzt dasselbe erreichen, wenn nur diejenigen neu indiziert werden, von denen es weiß, dass sie über Änderungsprotokolle erfolgen sollten?Gibt es eine Möglichkeit zur Neuindizierung? alle der Produkt-Flat-Daten, ohne alle anderen Indexer damit abzufangen enterprise_refresh_index?

Ich glaube nicht, dass es relevant ist, aber wir verwenden das AOE_Scheduler-Modul, um einen besseren Einblick in die Arbeit des Crons zu geben.


Ich weiß, es ist lang.Bitte lassen Sie mich wissen, ob ich es etwas besser zusammenfassen kann.Ich hatte kein Glück, eine definitive Antwort zu bekommen, und einige Admin-Benutzer sind nicht davon überzeugt, dass der Magento-Cron jedes Mal alles effektiv neu indiziert.Wenn eine solche Aussage gemacht wird, würde ich normalerweise alle Produkt-Flat-Daten von CLI neu indizieren, aber das kann ich nicht mehr tun, weil es Konflikte mit dem geplanten Indexer verursacht und die Hölle losbricht.

War es hilfreich?

Lösung

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;
}

Dies wird „immer“ bei jeder Cron-Ausführung ausgeführt.Es führt vollständige Neuindizierungen für die Indizes durch, die benötigt werden, und verarbeitet das Änderungsprotokoll für diejenigen, die dies nicht tun.

Außerdem können Sie weiterhin die CLI-Shell-Skripte ausführen, diese berücksichtigen jedoch nicht das teilweise Änderungsprotokoll und führen blind eine vollständige Neuindizierung durch.

Wenn Sie Deadlocks erhalten, möchten Sie möglicherweise alle Ihre Indexer auf setzen Manual und richten Sie alternative Prozesse ein, um den Index außerhalb der Spitzenzeiten (wenn Administratoren abwesend sind) neu zu erstellen.Nur Produktpreise Und Lagerbestand sollte auf „Beim Speichern aktualisieren“ eingestellt sein.

Beachten Sie auch, dass der Status der teilweisen Neuindizierung in ist index_process Tabelle wird nicht mehr verwendet, sondern daraus berechnet enterprise_mview_metadata.

Deaktivieren einiger interner Module wie Mage_Rss kann auch dazu beitragen, die Häufigkeit der Ungültigmachung der Indizes zu beeinflussen.

Weiterführende Literatur:

Andere Tipps

Nebenbei bemerkt, ich bin kürzlich auf das gestoßen AOE_EeIndexerStats Modul von AOEpeople auf GitHub – auf den ersten Blick sieht es so aus, als ob es Ihnen die Steuerung bestimmter Teile der Indexer oder ganzer Indexer ermöglicht, die alle darunter abgedeckt sind enterprise_refresh_index.Dies wäre möglicherweise ein Äquivalent zum vorherigen Prozess, bei dem Sie auf Folgendes abzielen könnten catalog_product_flat Index für sich allein.

Es sollte auch im Code als solches zugänglich sein:

$client = Mage::getModel('enterprise_mview/client'); /* @var $client Enterprise_Mview_Model_Client */
$client->initByTableName($tablename);
$metadata = $client->getMetadata();
$metadata->setInvalidStatus();
$metadata->save();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top