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 ([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();
}
}
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();
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
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.
quelle
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.
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
quelle
quelle
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.
quelle
M1 Indexerstatus prüfen
Führen Sie den folgenden Befehl im Stammverzeichnis aus, um den Status zu überprüfen.
Führen Sie den folgenden Befehl im Stammverzeichnis für den Prüfindexer aus.
cronjob: Wie man nur das neu indiziert, was benötigt wird.
Zum Beispiel: Ich setze alle 6 Stunden eine Neuindizierung
quelle