Những gì bạn muốn là tạo một tập lệnh CLI shell và sử dụng tập lệnh đó để xác định xem một chỉ mục có yêu cầu chỉ mục lại không.
Hãy xem các tập lệnh trong thư mục shell (log.php sẽ hoạt động tốt) như một ví dụ về cách tạo tập lệnh như vậy.
Tập lệnh bạn tạo sau đó sẽ kiểm tra trạng thái của chỉ mục và chỉ lập lại chỉ mục nếu nó ở trạng thái yêu cầu lập chỉ mục.
Tôi thường tạo các tập lệnh shell tùy chỉnh của mình trong một thư mục có tên / scripts, vì tôi không muốn làm ô nhiễm shell thư mục lõi bằng mã tùy chỉnh của mình.
Để đạt được hiệu quả này, tôi có một lớp trừu tượng mà tôi dựa trên tất cả các tập lệnh của mình và nó chứa mã cho phép tôi dễ dàng lập chỉ mục lại các chỉ mục nếu chúng yêu cầu lập chỉ mục.
đây là lớp trừu tượng của tôi:
/**
* 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();
}
}
Sau đó, một lớp dựa trên điều đó, gọi một chỉ mục lại, sau khi một số công việc đã được thực hiện.
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();