cronjob: Cómo reindexar solo lo que se necesita

8

Tenemos un servidor que tiene 5 tiendas por separado. Algunos están prácticamente inactivos. Algunos son activos diariamente. Para disminuir la carga del servidor. Cambiamos el índice de automático a manual. Luego establecemos un cronjob cada 6 horas. Me encontré suficientes ejemplos de indexación todos.

Ahora ejecutamos algo como esto
: 0 0,6,12,18 * * * php -f /shell/indexer.php reindexall
Shop1: Shop2: 0 1,7,13,19 * * * php -f /shell/indexer.php reindexall
y así sucesivamente, para evitar solapamientos.

En este momento, las tiendas inactivas también reindexan cada 6 horas donde no se necesita ninguna. ¿Hay alguna manera de reindexar solo lo que se necesita con un cronjob?

¿O estamos haciendo está mal del todo?

janw
fuente

Respuestas:

3

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();
ProxiBlue
fuente
Tengo que decir que la respuesta dada por @Flyingmana es, de hecho, mucho más inteligente que la mía;)
ProxiBlue
6

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

    $pCollection = Mage::getSingleton('index/indexer')->getProcessesCollection();

    foreach ($pCollection as $process) {
        $process->indexEvents();
    }

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.

Flyingmana
fuente
1
Solución interesante, no sabía que los eventos se guardan cuando se activa la "actualización manual". Esto permitiría indexar solo los datos modificados.
Andreas von Studnitz
0

Para reindexar los procesos, necesitamos sus identificadores.
Para el magento predeterminado, hay 9 procesos para reindexar, numerados del 1 al 9.

$ids = array(1,2,3,4,5,6,7,8,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

$ids = array(1,2,3,4,5,6,7,8,9,390,391,478);
foreach($ids as $id)
{
   //load each process through its id
   try
   {
      $process = Mage::getModel('index/process')->load($id);
      $process->reindexAll();
      echo "Indexing for Process ID # ".$id." Done<br />";
   }
   catch(Exception $e)
   {
      echo $e->getMessage();
   }
}
Deepak Mallah
fuente
Esto no responde a mi pregunta sobre cómo cambiar el cronjob. También esto reindexa todo. Solo quiero reindexar las partes que se cambian.
enero
0
<?php
// this loops through all indexes and processes those that say they require reindexing

include_once '../app/Mage.php';

$mageRunCode = isset ( $_SERVER ['MAGE_RUN_CODE'] ) ? $_SERVER ['MAGE_RUN_CODE'] : '';
$mageRunType = isset ( $_SERVER ['MAGE_RUN_TYPE'] ) ? $_SERVER ['MAGE_RUN_TYPE'] : 'store';

    $app = Mage::app ( $mageRunCode, $mageRunType );
    for($i=3; $i<=9; $i++){
        $process = Mage::getSingleton('index/indexer')->getProcessById($i);
        $state = $process->getStatus();
    //    echo '<pre>'.$process->getData('indexer_code').': '.htmlentities(print_r($process->getStatus(),true)).'</pre>';
        if($process->getStatus() == 'require_reindex'){
            $process->reindexEverything();
        }
    }
    ?>
jrossi
fuente
0

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.

<?php
// this loops through all indexes and processes those that say they require reindexing

include_once 'app/Mage.php';

$mageRunCode = isset ( $_SERVER ['MAGE_RUN_CODE'] ) ? $_SERVER ['MAGE_RUN_CODE'] : '';
$mageRunType = isset ( $_SERVER ['MAGE_RUN_TYPE'] ) ? $_SERVER ['MAGE_RUN_TYPE'] : 'store';

$app = Mage::app ( $mageRunCode, $mageRunType );

$ids = array(13,9,8,7,6,1,2,3,5,4);

foreach($ids as $id){
  $process = Mage::getSingleton('index/indexer')->getProcessById($id);
  $state = $process->getStatus();
//      echo '<pre>'.$process->getData('indexer_code').': '.htmlentities(print_r($process->getStatus(),true)).'</pre>';
  if($process->getStatus() == 'require_reindex'){
    $process->reindexEverything();
  }
}
Dan Tupper
fuente
2
FYI es @jim quien respondió no amit.
dh47
0

M1 comprobar el estado del indexador

Ejecute el siguiente comando en el directorio raíz para verificar el estado.

php shell/indexer.php --status

Ejecute el siguiente comando en el directorio raíz para verificar el indexador.

php shell/indexer.php info

cronjob: Cómo reindexar solo lo que se necesita.

Time php -f {magento file path}/shell/indexer.php --reindex {set indexer}

Por ejemplo: configuro reindexar cada 6 horas

*_6_*_*_* php -f /home/magento/public_html/shell/indexer.php --reindex catalogsearch_fulltex
Baharuni Asif
fuente