Вам нужно создать сценарий командной строки оболочки и использовать его, чтобы определить, требуется ли для индекса повторный индекс.
Взгляните на сценарии в папке оболочки (log.php подойдет) в качестве примера того, как создать такой сценарий.
Сценарий, который вы создадите, будет затем проверять состояние индекса и переиндексировать только в том случае, если он находится в состоянии, требующем индексации.
Обычно я создаю свои собственные сценарии оболочки в папке / scripts, так как я не люблю загрязнять оболочку основной папки своим пользовательским кодом.
Для этого у меня есть абстрактный класс, на котором я основываю все свои скрипты, и он содержит код, который позволяет мне легко переиндексировать индексаторы, если они требуют индексации.
вот мой абстрактный класс:
/**
* Abstracted functions for scripts
*
* @category ProxiBlue
* @package Scripts
* @author Lucas van Staden (sales@proxiblue.com.au)
* @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();
}
}
Затем класс, основанный на этом, который вызывает переиндексацию после некоторой работы.
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();
Насколько я знаю, индекс является чем-то глобальным, поэтому переиндексация всегда охватывает все магазины / сайты одного Magento.
Но у Magento есть некоторые функции, которые вам понравятся. В то время как «обновление при сохранении» выполняет обновления для индексации мгновенно, «ручное обновление» помещает те же «обновления» в очередь, которую вы можете запустить позже.
Для этого вам нужно написать собственный скрипт или задание cron.
Я не буду объяснять основы моделей процессов, просто взгляну на функцию indexEvents, она берет записи в очереди и обновляет их. Но будьте осторожны, индекс URL может быть немного медленным. Но это еще одна проблема.
источник
Для переиндексации процессов нам нужны их идентификаторы.
Для magento по умолчанию существует 9 процессов для переиндексации, пронумерованных от 1 до 9.
Иногда существуют процессы из наших пользовательских модулей, которые также требуют переиндексации. Нам нужно добавить эти идентификаторы в существующий массив идентификаторов. Чтобы узнать идентификатор процесса, просто наведите указатель мыши на каждый процесс в вашем
admin panel-> System-> Index Management
Вы получите URL: admin / process / some_id / ...... этот идентификатор соответствует процессу
источник
источник
Мне больше всего понравился ответ Амит Бера - но он изменил размещение идентификаторов в массиве и, что наиболее важно, организовал более плавную работу. Если вы пробежитесь по номерам, переиндексируя одну индексную таблицу, это может привести к тому, что другая станет недействительной. IE Index product_flat table, тогда цена может привести к тому, что плоский продукт станет недействительным и потребует повторной индексации.
источник
M1 проверить статус индексатора
Запустите следующую команду в корневом каталоге для проверки статуса.
Запустите следующую команду в корневом каталоге для проверки индексатора.
cronjob: Как переиндексировать только то, что нужно.
Например: я устанавливаю реиндекс каждые 6 часов
источник