cronjob: Wie man nur das neu indiziert, was benötigt wird


8

Wir haben einen Server mit 5 separaten Shops. Einige sind praktisch inaktiv. Einige sind täglich aktiv. So verringern Sie die Serverlast. Wir haben den Index von automatisch auf manuell geändert. Dann setzen wir alle 6 Stunden einen Cronjob. Ich fand genug Beispiele von all reindexing.

Wir führen jetzt so etwas aus:
Shop1: 0 0,6,12,18 * * * php -f /shell/indexer.php reindexall
Shop2: 0 1,7,13,19 * * * php -f /shell/indexer.php reindexall
und so weiter, um Überlappungen zu vermeiden.

Momentan indizieren die inaktiven Shops auch alle 6 Stunden neu, wo keine benötigt werden. Gibt es eine Möglichkeit, nur das neu zu indizieren, was für einen Cronjob benötigt wird?

Oder machen wir das überhaupt falsch?

Antworten:


3

Sie möchten ein Shell-CLI-Skript erstellen und damit feststellen, ob für einen Index eine Neuindizierung erforderlich ist.

Schauen Sie sich die Skripte im Shell-Ordner an (log.php reicht völlig aus), um zu zeigen, wie ein solches Skript erstellt wird.

Das von Ihnen erstellte Skript überprüft dann den Status des Index und indiziert nur dann neu, wenn es sich in einem Status befindet, für den eine Indizierung erforderlich ist.

Im Allgemeinen erstelle ich meine benutzerdefinierten Shell-Skripte in einem Ordner namens / scripts, da ich die Kernordner-Shell nicht gerne mit meinem benutzerdefinierten Code verschmutzen möchte.

Zu diesem Zweck habe ich eine abstrakte Klasse, auf der alle meine Skripte basieren, und sie enthält Code, mit dem ich Indexer einfach neu indizieren kann, wenn sie indiziert werden müssen.

Hier ist meine abstrakte Klasse:

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

}

Dann eine Klasse, die darauf basiert, die nach einiger Arbeit einen Re-Index aufruft.

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

Ich muss sagen, dass die Antwort von @Flyingmana tatsächlich viel schlauer ist als meine eigene;)
ProxiBlue

6

Was ich weiß, der Index ist etwas Globales, daher deckt ein Neuindex immer alle Geschäfte / Websites eines Magento ab.

Magento bietet jedoch einige Funktionen, die Ihnen gefallen werden. Während "Update on Save" die Aktualisierungen für den Index sofort ausführt, werden beim "manuellen Update" dieselben "Updates" in eine Warteschlange gestellt, die Sie später auslösen können.

Dazu müssen Sie Ihr eigenes Shell-Skript oder Ihren eigenen Cron-Job schreiben

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

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

Ich werde die Grundlagen der Prozessmodelle nicht erklären, sondern nur die Funktion indexEvents betrachten. Sie nimmt die Einträge der Warteschlange und aktualisiert sie. Aber seien Sie vorsichtig, der URL-Index kann etwas langsam sein. Aber das ist ein anderes Problem.


1
Interessante Lösung, ich wusste nicht, dass die Ereignisse gespeichert werden, wenn "manuelle Aktualisierung" aktiviert ist. Dies würde die Indizierung nur der geänderten Daten ermöglichen.
Andreas von Studnitz

0

Um die Prozesse neu zu indizieren, benötigen wir ihre IDs.
Für Standard-Magento müssen 9 Prozesse neu indiziert werden, nummeriert von 1 bis 9.

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

Manchmal gibt es Prozesse aus unseren benutzerdefinierten Modulen, die ebenfalls neu indiziert werden müssen. Wir müssen diese IDs zu unserem vorhandenen Array von IDs hinzufügen. Um die ID des Prozesses zu kennen, bewegen Sie den Mauszeiger einfach über jeden Prozess in Ihrem
admin panel-> System-> Index Management

Sie erhalten eine URL: admin / process / some_id / ...... diese ID entspricht dem Prozess

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

Dies beantwortet nicht meine Frage, wie man den Cronjob ändert. Auch dies indiziert alles neu. Ich möchte nur die Teile neu indizieren, die geändert werden.
Janw

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

Amit Beras Antwort hat mir am besten gefallen - aber die Platzierung der IDs in einem Array wurde geändert und vor allem für einen reibungslosen Betrieb angeordnet. Wenn Sie direkt durch die Zahlen laufen, kann eine Neuindizierung einer Indextabelle dazu führen, dass eine andere ungültig wird. IE Index product_flat table, dann kann der Preis dazu führen, dass die Product Flat Table ungültig wird und neu indiziert werden muss.

<?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
Zu Ihrer Information, es ist @jim, der nicht amit antwortete.
Dh47

0

M1 Indexerstatus prüfen

Führen Sie den folgenden Befehl im Stammverzeichnis aus, um den Status zu überprüfen.

php shell/indexer.php --status

Führen Sie den folgenden Befehl im Stammverzeichnis für den Prüfindexer aus.

php shell/indexer.php info

cronjob: Wie man nur das neu indiziert, was benötigt wird.

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

Zum Beispiel: Ich setze alle 6 Stunden eine Neuindizierung

*_6_*_*_* php -f /home/magento/public_html/shell/indexer.php --reindex catalogsearch_fulltex
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.