cronjob: come reindicizzare solo ciò che è necessario


8

Abbiamo un server che ha 5 negozi separati su di esso. Alcuni sono praticamente inattivi. Alcuni sono attivi quotidianamente. Per ridurre il carico del server. Abbiamo modificato l'indice da automatico a manuale. Quindi impostiamo un cronjob ogni 6 ore. Ho trovato abbastanza esempi di reindicizzazione di tutti.

Eseguiamo qualcosa del genere ora:
Shop1: 0 0,6,12,18 * * * php -f /shell/indexer.php reindexall
Shop2: 0 1,7,13,19 * * * php -f /shell/indexer.php reindexall
e così via, per evitare sovrapposizioni.

In questo momento anche i negozi inattivi reindicizzano ogni 6 ore dove non è necessario. C'è un modo per reindicizzare solo ciò che è necessario con un cronjob?

O stiamo sbagliando del tutto?

Risposte:


3

Quello che vuoi è creare uno script CLI della shell e usarlo per determinare se un indice richiede un reindicizzazione.

Dai un'occhiata agli script nella cartella shell (log.php andrà bene) come esempio su come creare uno script del genere.

Lo script creato verificherebbe quindi lo stato dell'indice e verrà reindicizzato solo se si trova in uno stato che richiede l'indicizzazione.

Generalmente creo i miei script di shell personalizzati in una cartella denominata / script, poiché non mi piace inquinare la shell delle cartelle principali con il mio codice personalizzato.

A tal fine, ho una classe astratta su cui baso tutti i miei script e contiene codice che mi consente di reindicizzare facilmente gli indicizzatori se richiedono l'indicizzazione.

ecco la mia classe astratta:

/**
 * 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();
    }

}

Quindi una classe che si basa su quella, che chiama un reindicizzatore, dopo che un po 'di lavoro è stato fatto.

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();

Devo dire che la risposta data da @Flyingmana è in effetti molto più intelligente della mia;)
ProxiBlue

6

Quello che so, l'Indice è qualcosa di globale, quindi un reindex copre sempre tutti i negozi / siti Web di un Magento.

Ma Magento ha alcune funzionalità che ti piaceranno. Mentre "aggiorna su Salva" esegue gli aggiornamenti all'indice istantaneo, "aggiornamento manuale" inserisce gli stessi "aggiornamenti" in una coda, che è possibile attivare in seguito.

Per questo, dovrai scrivere il tuo script shell o cron job

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

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

Non spiegherò le basi dei modelli di processo, basterà dare un'occhiata alla funzione indexEvents, prende le voci della coda e le aggiorna. Ma fai attenzione, l'indice URL può essere un po 'lento. Ma questo è un altro problema.


1
Soluzione interessante, non sapevo che gli eventi venivano salvati quando si attiva "aggiornamento manuale". Ciò consentirebbe di indicizzare solo i dati modificati.
Andreas von Studnitz,

0

Per reindicizzare i processi abbiamo bisogno dei loro ID.
Per magento predefinito ci sono 9 processi da reindicizzare, numerati da 1 a 9.

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

A volte ci sono processi dai nostri moduli personalizzati che richiedono anche la reindicizzazione. Dobbiamo aggiungere tali ID al nostro array di ID esistente, per conoscere l'id del processo, passa con il mouse su ogni processo nel tuo
admin panel-> System-> Index Management

Otterrai un url: admin / process / some_id / ...... questo ID corrisponde al processo

$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();
   }
}

Questo non risponde alla mia domanda su come cambiare il cronjob. Anche questo reindicizza tutto. Voglio solo reindicizzare le parti che vengono cambiate.
gennaio

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();
        }
    }
    ?>

0

Mi è piaciuta la risposta di Amit Bera, ma è stata modificata inserendo gli ID in un array e, soprattutto, organizzato per un funzionamento più fluido. Se i numeri vengono reindicizzati direttamente da una tabella di indice, è possibile che un'altra non sia valida. Indice IE tabella product_flat quindi il prezzo può rendere non valida la tabella piatta del prodotto e richiedere una nuova indicizzazione.

<?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();
  }
}

2
Cordiali saluti, è il suo @jim che non ha risposto.
dh47,

0

M1 verifica lo stato dell'indicizzatore

Esegui sotto il comando nella directory principale per verificare lo stato.

php shell/indexer.php --status

Esegui sotto il comando nella directory principale per l'indicizzatore di controllo.

php shell/indexer.php info

cronjob: come reindicizzare solo ciò che è necessario.

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

Ad esempio: imposto reindex ogni 6 ore

*_6_*_*_* php -f /home/magento/public_html/shell/indexer.php --reindex catalogsearch_fulltex
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.