O que você deseja é criar um script da CLI do shell e usá-lo para determinar se um índice requer um re-índice.
Dê uma olhada nos scripts na pasta shell (log.php funcionará bem) como um exemplo de como criar esse script.
O script que você criar verificaria o status do índice e somente o indexaria novamente novamente se estiver em um status que exija indexação.
Geralmente, crio meus scripts de shell customizados em uma pasta chamada / scripts, pois não gosto de poluir o shell da pasta principal com meu código personalizado.
Para esse efeito, tenho uma classe abstrata na qual baseamos todos os meus scripts e contém um código que me permite re-indexar facilmente indexadores, se eles precisarem de indexação.
aqui está minha classe abstrata:
/**
* Abstracted functions for scripts
*
* @category ProxiBlue
* @package Scripts
* @author Lucas van Staden ([email protected])
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*
*/
require_once dirname(__FILE__) . '/../shell/abstract.php';
class Mage_Shell_Scripts_Abstract extends Mage_Shell_Abstract {
public $_doReindexFlag = false;
public function run() {
die('Please implement a run function inyour script');
}
/**
* Get the category model
* @return Object
*/
public function getCatalogModel() {
return Mage::getModel('catalog/category');
}
/**
* Reindex given indexers.
* Tests if indexer actually needs re-index, and is not in manual state before it does index.
*
* @param array $reIndex
*/
public function reindex(array $reIndex) {
foreach ($reIndex as $indexerId) {
$process = $this->_getIndexer()->getProcessByCode($indexerId);
if ($process->getStatus() == Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX && $process->getMode() != Mage_Index_Model_Process::MODE_MANUAL) {
try {
echo "Reindexing: " . $process->getIndexerCode();
$process->reindexEverything();
} catch (Exception $e) {
mage::logException("{$indexer} Indexer had issues. {$e->getMessage()}");
}
}
}
}
/**
* Get Indexer instance
*
* @return Mage_Index_Model_Indexer
*/
private function _getIndexer() {
return Mage::getSingleton('index/indexer');
}
/**
* Returns a list of cache types.
* @return void
*/
public function getInvalidateCache() {
$invalidTypes = $this->_getInvalidatedTypes();
$result = array();
foreach($invalidTypes as $cache) {
if ($cache->status == 1) {
$result[] = $cache;
}
}
return $result;
}
/**
* Gets a list of invalidated cache types that should be refreshed.
* @return array Array of invalidated types.
*/
private function _getInvalidatedTypes() {
return Mage::getModel('core/cache')->getInvalidatedTypes();
//return $this->_getCacheTypes();
}
/**
* Gets Magento cache types.
* @return
*/
private function _getCacheTypes() {
//return Mage::helper('core')->getCacheTypes();
return Mage::getModel('core/cache')->getTypes();
}
}
Em seguida, uma classe que é baseada nisso, que chama um re-índice, depois que algum trabalho foi feito.
require_once dirname(__FILE__) . '/abstract.php';
class Mage_Shell_setCategoryStatus extends Mage_Shell_Scripts_Abstract {
public $_doReindexFlag = true;
public function run() {
/** code stripped out as not warrented for this answer **/
if ($this->_doReindexFlag) {
$this->reindex(array('catalog_product_flat',
'catalog_category_flat',
'catalog_category_product',
'cataloginventory_stock',
'catalogsearch_fulltext',
));
}
}
}
$shell = new Mage_Shell_setCategoryStatus();
$shell->run();
O que eu sei, o Índice é algo global, portanto, uma reindexa sempre cobre todas as lojas / sites de um Magento.
Mas, Magento tem algumas funcionalidades que você vai gostar. Enquanto "update on Save" faz as atualizações para indexar instantaneamente, a "atualização manual" coloca as mesmas "atualizações" em uma fila, que você pode acionar mais tarde.
Para isso, você precisará escrever seu próprio shell script ou tarefa cron
Não vou explicar o básico dos modelos de processo, basta dar uma olhada na função indexEvents, pegar as entradas da fila e atualizá-las. Mas tenha cuidado, o Índice de URL pode ser um pouco lento. Mas isso é outro problema.
fonte
Para reindexar os processos, exigimos seus IDs.
Para o magento padrão, existem 9 processos para reindexar, numerados de 1 a 9.
Às vezes, existem processos de nossos módulos personalizados que também exigem reindexação. Precisamos adicionar esses IDs à nossa matriz existente de IDs. Para conhecer o ID do processo, passe o mouse sobre cada processo em seu
admin panel-> System-> Index Management
Você receberá uma URL: admin / process / some_id / ...... esse id corresponde ao processo
fonte
fonte
Gostei mais da resposta de Amit Bera - mas modifiquei a colocação dos IDs em uma matriz e, o mais importante, arranjei para uma operação mais suave. Se você passar direto pelos números, a nova indexação de uma tabela de índice poderá fazer com que outra se torne inválida. Tabela I_Product do índice do IE, o preço pode fazer com que a tabela simples do produto se torne inválida e precise ser reindexada.
fonte
Verificar status do indexador M1
Execute o comando abaixo no diretório raiz para verificar o status.
Execute o comando abaixo no diretório raiz do indexador de verificação.
cronjob: Como reindexar apenas o necessário.
Por exemplo: defino a reindexação a cada 6 horas
fonte