Question

Cette question est restée sans réponse pour moi depuis un moment maintenant, et j'aimerais obtenir une réponse définitive de quelqu'un sur la façon dont cela fonctionne.

Scénario:

Sous Magento 1.14.2.1, j'ai configuré tous mes indexeurs pour qu'ils s'exécutent dans les délais et j'exécute le cron de Magento qui s'exécute enterprise_refresh_index chaque fois que quelque chose doit être partiellement (ou entièrement ?) indexé.

Avant la mise à niveau vers cette version, j'exécutais 1.13.1 et n'utilisais pas cron.J'avais des indexeurs configurés pour être activés sauvegarder, et chaque fois que j'avais besoin de forcer l'exécution d'un indexeur, je le faisais soit via shell/indexer.php ou en utilisant l'exemple de code suivant :

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

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

Précédemment...

Cela fonctionnait bien auparavant, car les indexeurs s'exécutaient immédiatement lorsque je le souhaitais et les diverses modifications requises se propageaient relativement rapidement au frontend, etc.

Évidemment, nous avons rencontré des problèmes de blocage/verrouillage de table et des indexeurs en conflit les uns avec les autres lorsque plusieurs utilisateurs administrateurs enregistraient des produits, etc. en même temps, d'où notre passage à la nouvelle "meilleure pratique" consistant à utiliser le cron de Magento pour tout gérer. calendrier.

Mes questions:

  1. Comment remplacer l'ancien style consistant à forcer une réindexation plate d'un produit (php shell/indexer.php --reindex catalog_product_flat) avec l'équivalent maintenant via la tâche cron planifiée ?Tout ce que je peux voir, c'est que tu peux courir enterprise_refresh_index travail cron, mais cela gère tous les indexeurs n'est-ce pas - aucune possibilité de distinguer certaines parties ?
  2. Est-il même pertinent de devoir faire cela encore ?Je veux dire par là qu'en exécutant cette commande précédente, Magento aurait-il toujours indexé uniquement ce dont il avait besoin dans le domaine plat du produit du catalogue, et en exécutant la tâche planifiée, il fait la même chose mais combine tous les indexeurs en un seul ?Si tel est le cas, ce n’est pas grave – c’est juste assez déroutant à comprendre.

Arrière-plan:

J'ai posé cette question avec le support de Magento EE.Ils sont revenus pour dire qu'il tombe en dehors du domaine des accords de soutien, mais a toujours obtenu une réponse de l'un des développeurs Magento et m'a répondu en disant que "les modifications à la base de données sont détectées avec des déclencheurs et les enregistrements de changelog créés". Je comprends qu'à partir d'ici, l'indexeur planifié décide ce qui doit être fait en fonction de ces enregistrements de changelog.

Auparavant, j'avais en quelque sorte supposé que si je devais réindexer les tables plates des produits (tous les produits, tout), je le ferais à partir de la ligne de commande comme dans l'exemple précédent.Comment puis-je obtenir la même chose maintenant s'il ne réindexe que ceux qu'il sait devoir être effectués via les journaux de modifications ?Existe-t-il un moyen de réindexer tous des données plates du produit sans attraper tous les autres indexeurs via enterprise_refresh_index?

Je ne pense pas que ce soit pertinent, mais nous utilisons le module AOE_Scheduler pour donner un meilleur aperçu de ce que fait le cron.


Je sais que c'est long.S'il vous plaît laissez-moi savoir si je peux résumer un peu mieux.Je n'ai pas eu de chance d'obtenir une réponse définitive, et certains utilisateurs administrateurs ne sont pas convaincus que le cron de Magento réindexe tout efficacement à chaque fois.Lorsque ce type de déclaration est fait, je réindexe normalement toutes les données plates du produit à partir de la CLI, mais je ne peux plus le faire car cela provoque des conflits avec l'indexeur planifié et l'enfer se déchaîne.

Était-ce utile?

La solution

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

Cela s'exécute "toujours" à chaque exécution de cron.Il exécute des réindexations complètes pour les index nécessaires et traite le journal des modifications pour ceux qui ne le sont pas.

En outre, vous pouvez toujours exécuter les scripts shell CLI, mais ils ne prendront pas en compte le journal des modifications partiel et effectueront aveuglément une réindexation complète.

Si vous obtenez des verrous morts, vous souhaiterez peut-être définir tous vos indexeurs sur Manual et configurez des processus alternatifs pour reconstruire l'index pendant les heures creuses (lorsque les administrateurs sont absents).Seulement Prix ​​des produits et État des stocks doit être défini sur Mettre à jour lors de l'enregistrement.

Gardez également à l'esprit qu'avec le statut de réindexation partielle dans index_process le tableau n'est plus utilisé mais calculé à partir de enterprise_mview_metadata.

Désactiver certains modules internes comme Mage_Rss peut également contribuer à influer sur la fréquence d’invalidation des index.

Lectures complémentaires :

Autres conseils

En passant, je suis récemment tombé sur le AOE_EeIndexerStats module d'AOEpeople sur GitHub - d'un simple coup d'œil, il semble qu'il vous permettra de contrôler certaines parties des indexeurs ou des indexeurs entiers, qui sont tous couverts sous enterprise_refresh_index.Cela serait potentiellement équivalent au processus précédent, dans lequel vous pouviez cibler les catalog_product_flat index à lui seul.

Il doit également être accessible en code comme tel :

$client = Mage::getModel('enterprise_mview/client'); /* @var $client Enterprise_Mview_Model_Client */
$client->initByTableName($tablename);
$metadata = $client->getMetadata();
$metadata->setInvalidStatus();
$metadata->save();
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top