Last active
May 1, 2017 20:37
Magento: only reindex invalidated indexes shell/indexer.php replacement
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Add the parameter "reindexallrequired" to only index the indexers | |
* that are in need of processing to avoid doing full reindexes | |
* that disregard the state of the index as indexer.php does | |
* | |
* Usage: | |
* php shell/betterindexer.php reindexallrequired | |
* | |
* http://magento.stackexchange.com/a/62272/69 | |
*/ | |
require_once 'abstract.php'; | |
/** | |
* Magento Compiler Shell Script | |
* | |
* @category Mage | |
* @package Mage_Shell | |
* @author Magento Core Team <core@magentocommerce.com> | |
*/ | |
class Mage_Shell_Compiler extends Mage_Shell_Abstract | |
{ | |
/** | |
* Get Indexer instance | |
* | |
* @return Mage_Index_Model_Indexer | |
*/ | |
protected function _getIndexer() | |
{ | |
return $this->_factory->getSingleton($this->_factory->getIndexClassAlias()); | |
} | |
/** | |
* Parse string with indexers and return array of indexer instances | |
* | |
* @param string $string | |
* @return array | |
*/ | |
protected function _parseIndexerString($string) | |
{ | |
$processes = array(); | |
if ($string == 'all') { | |
$collection = $this->_getIndexer()->getProcessesCollection(); | |
foreach ($collection as $process) { | |
if ($process->getIndexer()->isVisible() === false) { | |
continue; | |
} | |
$processes[] = $process; | |
} | |
} else if (!empty($string)) { | |
$codes = explode(',', $string); | |
$codes = array_map('trim', $codes); | |
$processes = $this->_getIndexer()->getProcessesCollectionByCodes($codes); | |
foreach($processes as $key => $process) { | |
if ($process->getIndexer()->getVisibility() === false) { | |
unset($processes[$key]); | |
} | |
} | |
if ($this->_getIndexer()->hasErrors()) { | |
echo implode(PHP_EOL, $this->_getIndexer()->getErrors()), PHP_EOL; | |
} | |
} | |
return $processes; | |
} | |
/** | |
* Run script | |
* | |
*/ | |
public function run() | |
{ | |
$_SESSION = array(); | |
if ($this->getArg('info')) { | |
$processes = $this->_parseIndexerString('all'); | |
foreach ($processes as $process) { | |
/* @var $process Mage_Index_Model_Process */ | |
echo sprintf('%-30s', $process->getIndexerCode()); | |
echo $process->getIndexer()->getName() . "\n"; | |
} | |
} else if ($this->getArg('status') || $this->getArg('mode')) { | |
if ($this->getArg('status')) { | |
$processes = $this->_parseIndexerString($this->getArg('status')); | |
} else { | |
$processes = $this->_parseIndexerString($this->getArg('mode')); | |
} | |
foreach ($processes as $process) { | |
/* @var $process Mage_Index_Model_Process */ | |
$status = 'unknown'; | |
if ($this->getArg('status')) { | |
switch ($process->getStatus()) { | |
case Mage_Index_Model_Process::STATUS_PENDING: | |
$status = 'Pending'; | |
break; | |
case Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX: | |
$status = 'Require Reindex'; | |
break; | |
case Mage_Index_Model_Process::STATUS_RUNNING: | |
$status = 'Running'; | |
break; | |
default: | |
$status = 'Ready'; | |
break; | |
} | |
} else { | |
switch ($process->getMode()) { | |
case Mage_Index_Model_Process::MODE_SCHEDULE: | |
$status = 'Update by schedule'; | |
break; | |
case Mage_Index_Model_Process::MODE_REAL_TIME: | |
$status = 'Update on Save'; | |
break; | |
case Mage_Index_Model_Process::MODE_MANUAL: | |
$status = 'Manual Update'; | |
break; | |
} | |
} | |
echo sprintf('%-35s ', $process->getIndexer()->getName() . ':') . $status ."\n"; | |
} | |
} else if ($this->getArg('mode-realtime') || $this->getArg('mode-manual')) { | |
if ($this->getArg('mode-realtime')) { | |
$mode = Mage_Index_Model_Process::MODE_REAL_TIME; | |
$processes = $this->_parseIndexerString($this->getArg('mode-realtime')); | |
} else { | |
$mode = Mage_Index_Model_Process::MODE_MANUAL; | |
$processes = $this->_parseIndexerString($this->getArg('mode-manual')); | |
} | |
foreach ($processes as $process) { | |
/* @var $process Mage_Index_Model_Process */ | |
try { | |
$process->setMode($mode)->save(); | |
echo $process->getIndexer()->getName() . " index was successfully changed index mode\n"; | |
} catch (Mage_Core_Exception $e) { | |
echo $e->getMessage() . "\n"; | |
} catch (Exception $e) { | |
echo $process->getIndexer()->getName() . " index process unknown error:\n"; | |
echo $e . "\n"; | |
} | |
} | |
} else if ($this->getArg('reindex') || $this->getArg('reindexall') || $this->getArg('reindexallrequired') ) { | |
if ($this->getArg('reindex')) { | |
$processes = $this->_parseIndexerString($this->getArg('reindex')); | |
} else { | |
$processes = $this->_parseIndexerString('all'); | |
} | |
try { | |
Mage::dispatchEvent('shell_reindex_init_process'); | |
foreach ($processes as $process) { | |
/* @var $process Mage_Index_Model_Process */ | |
try { | |
//reindex only if required | |
if( $this->getArg('reindexallrequired') && $process->getStatus() == Mage_Index_Model_Process::STATUS_PENDING ) | |
continue; | |
$startTime = microtime(true); | |
$process->reindexEverything(); | |
$resultTime = microtime(true) - $startTime; | |
Mage::dispatchEvent($process->getIndexerCode() . '_shell_reindex_after'); | |
echo $process->getIndexer()->getName() | |
. " index was rebuilt successfully in " . gmdate('H:i:s', $resultTime) . "\n"; | |
} catch (Mage_Core_Exception $e) { | |
echo $e->getMessage() . "\n"; | |
} catch (Exception $e) { | |
echo $process->getIndexer()->getName() . " index process unknown error:\n"; | |
echo $e . "\n"; | |
} | |
} | |
Mage::dispatchEvent('shell_reindex_finalize_process'); | |
} catch (Exception $e) { | |
Mage::dispatchEvent('shell_reindex_finalize_process'); | |
echo $e->getMessage() . "\n"; | |
} | |
} else { | |
echo $this->usageHelp(); | |
} | |
} | |
/** | |
* Retrieve Usage Help Message | |
* | |
*/ | |
public function usageHelp() | |
{ | |
return <<<USAGE | |
Usage: php -f indexer.php -- [options] | |
--status <indexer> Show Indexer(s) Status | |
--mode <indexer> Show Indexer(s) Index Mode | |
--mode-realtime <indexer> Set index mode type "Update on Save" | |
--mode-manual <indexer> Set index mode type "Manual Update" | |
--reindex <indexer> Reindex Data | |
info Show allowed indexers | |
reindexall Reindex Data by all indexers | |
reindexallrequired Only reindex invalidated indexes | |
help This help | |
<indexer> Comma separated indexer codes or value "all" for all indexers | |
USAGE; | |
} | |
} | |
$shell = new Mage_Shell_Compiler(); | |
$shell->run(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment