Lo que desea es crear una secuencia de comandos de la CLI de shell y utilizarla para determinar si un índice requiere una reindexación.
Eche un vistazo a los scripts en la carpeta de shell (log.php funcionará bien) como un ejemplo de cómo hacer un script de este tipo.
El script que cree verificará el estado del índice y solo volverá a indexar si está en un estado que requiere indexación.
Generalmente creo mis scripts de shell personalizados en una carpeta llamada / scripts, ya que no me gusta contaminar el shell de la carpeta principal con mi código personalizado.
Para este efecto, tengo una clase abstracta en la que baso todos mis scripts, y contiene un código que me permite volver a indexar fácilmente los indexadores si requieren indexación.
Aquí está mi clase abstracta:
/**
* 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();
}
}
Luego, una clase que se basa en eso, que llama a un re-índice, después de que se haya realizado un trabajo.
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();
Lo que sé, el índice es algo global, por lo que una reindex siempre cubre todas las tiendas / sitios web de un Magento.
Pero, Magento tiene alguna funcionalidad que le gustará. Mientras que "actualizar al guardar" realiza las actualizaciones al índice instantáneo, la "actualización manual" pone las mismas "actualizaciones" en una cola, que puede activar más adelante.
Para esto, deberá escribir su propio script de shell o trabajo cron
No explicaré los conceptos básicos de los modelos de proceso, simplemente eche un vistazo a la función indexEvents, toma las entradas de la cola y las actualiza. Pero tenga cuidado, el índice de URL puede ser un poco lento. Pero ese es otro problema.
fuente
Para reindexar los procesos, necesitamos sus identificadores.
Para el magento predeterminado, hay 9 procesos para reindexar, numerados del 1 al 9.
A veces hay procesos de nuestros módulos personalizados que también requieren reindexación. Necesitamos agregar esos identificadores a nuestra matriz existente de identificadores. Para conocer la identificación del proceso, simplemente desplace el cursor sobre cada proceso en su
admin panel-> System-> Index Management
Obtendrá una URL: admin / process / some_id / ...... este id corresponde al proceso
fuente
fuente
Me gustó la respuesta de Amit Bera, pero modifiqué colocando los id en una matriz y, lo más importante, dispuestos para una operación más fluida. Si corre directamente a través de los números, volver a indexar una tabla de índice puede hacer que otra deje de ser válida. El índice IE product_flat table luego el precio puede hacer que la tabla plana del producto deje de ser válida y necesite volver a indexarse.
fuente
M1 comprobar el estado del indexador
Ejecute el siguiente comando en el directorio raíz para verificar el estado.
Ejecute el siguiente comando en el directorio raíz para verificar el indexador.
cronjob: Cómo reindexar solo lo que se necesita.
Por ejemplo: configuro reindexar cada 6 horas
fuente