2014-01-23 3 views
6

Magento 1.13 добавила частичную индексацию для большинства индексов наряду с возможностью отложить процесс индексирования к заданию cron, которое выполняется асинхронно.Когда выполняется автоматическое частичное переиндексирование в Magento EE 1.13?

Мой вопрос в том, есть ли существующая работа cron, которая делает это или это что-то, что мне нужно настроить самостоятельно?

Документация не ясно по этому вопросу: http://www.magentocommerce.com/knowledge-base/entry/ee113-indexing#reindex-options

  • Update, когда планируется планировать переиндексации с помощью Magento хрон.
  • Изменение происходит либо в течение минуты, либо в соответствии с графиком работы cron.

Это заставляет меня поверить, что это существующий процесс, который запускается при каждом запуске хрон.

Я вижу график уборщика индекса, но это только кажется, что очистка старых записей в таблицах журналов изменений. На самом деле это не похоже на индексацию.

Я не могу найти работу cron в основном коде, который запускает эти индексы.

ответ

9

Я думаю, что нашел. enterprise_refresh_index

<enterprise_refresh_index> 
    <schedule> 
     <cron_expr>always</cron_expr> 
    </schedule> 
    <run> 
     <model>enterprise_index/observer::refreshIndex</model> 
    </run> 
</enterprise_refresh_index> 

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

Это работает "всегда" при каждом исполнении хрон. Он выполняет полные реиндексы для индексов, которые нуждаются и обрабатывают журнал изменений для тех, кто этого не делает.

Смежные вопросы