Pregunta

Esta pregunta ha sido algo sin respuesta para mí por un tiempo ahora, y me gustaría obtener una respuesta definitiva de alguien acerca de cómo funciona.

Escenario:

Ejecución de Magento 1.14.2.1, he puesto todos mis correctores de pruebas para ejecutar en el horario, y me ejecute el cron de Magento, que se ejecuta enterprise_refresh_index cuando algo necesita ser parcialmente (o totalmente?) indizada.

Antes de la actualización a esta versión, yo estaba corriendo 1.13.1 y no estaba usando el cron.Yo había indizadores conjunto para estar en guardar, y cada vez que necesitaba para obligar a cualquiera de los indizadores a correr me gustaría hacerlo, ya sea a través de shell/indexer.php o utilizando el siguiente código de ejemplo:

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

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

Previamente...

Esto funcionó bien previamente en términos de tener los indizadores en ejecución de inmediato cuando yo quiera, y tener los diversos cambios necesarios propagar de forma relativamente rápida a la interfaz, etc.

Obviamente nos encontramos con interbloqueo/bloqueo de tabla de problemas y indizadores en conflicto el uno con el otro cuando tuvimos varias de administración de usuarios de productos de ahorro etc, al mismo tiempo, de ahí nuestra mudanza a la nueva "mejores prácticas" de usar el cron de Magento para manejar todo en el horario.

Mis preguntas:

  1. ¿Cómo se puede reemplazar el viejo estilo de forzar un producto plano reindex (php shell/indexer.php --reindex catalog_product_flat) con el equivalente en la actualidad a través de la hora programada de la tarea en el cron?Todos los que me parece ver es que puede ejecutar enterprise_refresh_index cron job, sino que se encarga de todos los indizadores - no hay capacidad de un solo ciertas partes?
  2. Es aún relevante a tener que hacer esto más?Con esto quiero decir que al hacer que el comando anterior, sería Magento todavía indexados lo necesario para que dentro del catálogo de productos planos reino, y mediante la ejecución de la tarea programada se hace lo mismo, pero los combina todos los indizadores en uno solo?Si este es el caso, está bien - es bastante confuso de entender.

Antecedentes:

Me han hecho esta pregunta con Magento EE.Volvieron a decir que se encuentra fuera de la esfera de los acuerdos de apoyo, pero todavía tiene una respuesta de uno de los desarrolladores de Magento y me respondió diciendo que "los cambios a la base de datos se detectan con los desencadenadores y tiene changelog los registros creados." Entiendo que a partir de aquí, la programada indizador decide lo que debe hacerse basándose en los cambios de registros.

Yo ya me tienen asumido que si tengo que volver a indexar el producto plana tablas (todos los productos, todo), me gustaría hacerlo desde la línea de comandos como el ejemplo anterior.¿Cómo puedo lograr lo mismo ahora si va sólo indexar los que se sabe que se debe hacer a través de cambios?Hay una manera de volver a indexar todos del producto plana de datos sin la captura de todos los otros indexadores con él a través de enterprise_refresh_index?

No creo que su pertinente, pero usamos el AOE_Scheduler módulo para dar una mejor visión de lo que el cron está haciendo.


Sé que es largo.Por favor, hágamelo saber si puedo resumir un poco mejor.He tenido suerte en conseguir una respuesta definitiva, y algunos usuarios de administración no están convencidos de que el cron de Magento es indexar todo lo que efectivamente cada vez.Cuando este tipo de declaración, yo normalmente reindexar todos los productos plana de datos desde el CLI, pero yo no puedo hacer eso, ya que causa conflictos con el programa del indexador y todo el infierno se rompe suelto.

¿Fue útil?

Solución

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

Esto va en "siempre" en el cron de ejecución.Se ejecuta completa re-índices de los índices que son necesarios y los procesos de la lista de cambios para los que no.

También, usted todavía puede ejecutar el CLI de secuencias de comandos de shell, pero no van a considerar el parcial changelog y ciegamente y no volver a indexar.

Si usted está recibiendo las cerraduras, puede que desee configurar todos sus correctores de pruebas para Manual y la instalación de procesos alternativos para reconstruir el índice fuera de las horas pico (cuando los administradores de distancia).Sólo Los Precios De Los Productos y El Estado De Los Stocks debe ser configurado para Actualizar en Guardar.

También hay que tener en cuenta que con parciales de re-indexación de estado en index_process tabla no se utiliza, pero se calcula a partir de enterprise_mview_metadata.

La desactivación de algunos módulos internos como Mage_Rss también puede ayudar el impacto de la frecuencia de la invalidación de los índices.

Leer más:

Otros consejos

Como un aparte, recientemente me encontré con el AOE_EeIndexerStats módulo de AOEpeople en GitHub - de un rápido vistazo parece que va a permitir el control de ciertas partes de los indexadores o toda la indizadores, que están cubiertos bajo enterprise_refresh_index.Este podría ser un equivalente a la anterior proceso, donde se podría centrarse en la catalog_product_flat índice en su propio.

También debe ser accesible en el código como tal:

$client = Mage::getModel('enterprise_mview/client'); /* @var $client Enterprise_Mview_Model_Client */
$client->initByTableName($tablename);
$metadata = $client->getMetadata();
$metadata->setInvalidStatus();
$metadata->save();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top