Skip to content

Instantly share code, notes, and snippets.

@molotovbliss
Last active May 1, 2017 20:37
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save molotovbliss/3f1a4a30353a76fb693f29eef949756e to your computer and use it in GitHub Desktop.
Save molotovbliss/3f1a4a30353a76fb693f29eef949756e to your computer and use it in GitHub Desktop.
Magento: only reindex invalidated indexes shell/indexer.php replacement
<?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