Ce que vous voulez, c'est créer un script CLI shell, et l'utiliser pour déterminer si un index nécessite un ré-indexage.
Jetez un œil aux scripts dans le dossier shell (log.php fera l'affaire) comme exemple sur la façon de créer un tel script.
Le script que vous créez vérifierait alors l'état de l'index et ne ré-indexerait que s'il se trouve dans un état qui nécessite une indexation.
Je crée généralement mes scripts shell personnalisés dans un dossier appelé / scripts, car je n'aime pas polluer le shell du dossier principal avec mon code personnalisé.
À cet effet, j'ai une classe abstraite sur laquelle je base tous mes scripts, et elle contient du code qui me permet de réindexer facilement les indexeurs s'ils nécessitent une indexation.
voici ma classe abstraite:
/**
* 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();
}
}
Ensuite, une classe basée sur cela, qui appelle un ré-index, après un certain travail.
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();
Ce que je sais, l'Index est quelque chose de global, donc une réindexation couvre toujours tous les magasins / sites Web d'un Magento.
Mais, Magento a certaines fonctionnalités que vous aimerez. Tandis que la «mise à jour lors de l'enregistrement» effectue les mises à jour pour indexer instantanément, la «mise à jour manuelle» place les mêmes «mises à jour» dans une file d'attente, que vous pouvez déclencher ultérieurement.
Pour cela, vous devrez écrire votre propre script shell ou tâche cron
Je n'expliquerai pas les bases des modèles de processus, jetez simplement un œil à la fonction indexEvents, elle prend les entrées de la file d'attente et les met à jour. Mais attention, l'index URL peut être un peu lent. Mais c'est un autre problème.
la source
Pour réindexer les processus, nous avons besoin de leurs identifiants.
Pour magento par défaut, il y a 9 processus à réindexer, numérotés de 1 à 9.
Parfois, il existe des processus de nos modules personnalisés qui nécessitent également une réindexation. Nous devons ajouter ces identifiants à notre tableau existant d’identifiants.
admin panel-> System-> Index Management
Vous obtiendrez une URL: admin / process / some_id / ...... cet identifiant correspond au processus
la source
la source
J'ai préféré la réponse d'Amit Bera - mais modifié en plaçant les identifiants dans un tableau et surtout arrangé pour un fonctionnement plus fluide. Si vous exécutez directement à travers les nombres, la réindexation d'une table d'index peut entraîner la invalidité d'une autre. IE Index product_flat table alors le prix peut rendre la table plate du produit invalide et nécessiter une réindexation.
la source
M1 vérifier l'état de l'indexeur
Exécutez la commande ci-dessous dans le répertoire racine pour vérifier l'état.
Exécutez la commande ci-dessous dans le répertoire racine pour vérifier l'indexeur.
cronjob: comment réindexer uniquement ce qui est nécessaire.
Par exemple: je règle la réindexation toutes les 6 heures
la source