cronjob:必要なものだけを再インデックスする方法


8

5つの別々のショップがあるサーバーを取得しました。一部は実質的に非アクティブです。一部は毎日アクティブです。サーバーの負荷を減らすため。インデックスを自動から手動に変更しました。その後、6時間ごとにcronjobを設定します。すべてインデックスを再作成する十分な見つけました

ここでは、
Shop1:0 0,6,12,18 * * * php -f /shell/indexer.php reindexall
Shop2:0 1,7,13,19 * * * php -f /shell/indexer.php reindexall
などのように、重複を避けるために、次のように実行します。

現在、非アクティブなショップも6時間ごとにインデックスを再作成しており、何も必要ありません。cronジョブで必要なものだけを再インデックスする方法はありますか?

それとも、私たちは完全に間違っていますか?

回答:


3

必要なのは、シェルCLIスクリプトを作成し、それを使用して、インデックスに再インデックスが必要かどうかを判断することです。

このようなスクリプトを作成する方法の例として、シェルフォルダー内のスクリプトを確認してください(log.phpで問題ありません)。

作成したスクリプトは、インデックスのステータスをチェックし、インデックス作成が必要なステータスの場合のみ再インデックスします。

カスタムコードでコアフォルダーシェルを汚染したくないので、通常、/ scriptsというフォルダーにカスタムシェルスクリプトを作成します。

これを実現するために、すべてのスクリプトを基にした抽象クラスがあり、インデックスが必要な場合にインデクサーのインデックスを簡単に再作成できるコードが含まれています。

これが私の抽象クラスです:

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

}

次に、いくつかの作業が行われた後、それを基にしたクラスがre-indexを呼び出します。

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

@Flyingmanaによって与えられた答えは、実際には私のものよりもはるかに賢いです;)
ProxiBlue

6

私が知っていること、インデックスはグローバルなものなので、再インデックスは常に1つのMagentoのすべてのストア/ウェブサイトをカバーします。

しかし、Magentoには好きな機能がいくつかあります。「更新時に保存」はインデックスの更新を即時に実行しますが、「手動更新」は同じ「更新」をキューに入れ、後でトリガーできます。

このためには、独自のシェルスクリプトまたはcronジョブを作成する必要があります

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

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

プロセスモデルの基本については説明しません。indexEvents関数を見てください。キューのエントリを取得して更新します。ただし注意してください。URLインデックスは少し遅くなる可能性があります。しかし、それは別の問題です。


1
興味深い解決策として、「手動更新」がアクティブ化されたときにイベントが保存されることを知りませんでした。これにより、変更されたデータのみにインデックスを作成できます。
Andreas von Studnitz、2014

0

プロセスのインデックスを再作成するには、IDが必要です。
デフォルトのmagentoの場合、インデックスを再作成するプロセスは9つあり、1から9までの番号が付けられています。

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

場合によっては、インデックスの再作成も必要とするカスタムモジュールのプロセスがあります。これらのIDを既存のID配列に追加する必要があります。プロセスのIDを知るには、
admin panel-> System-> Index Management

あなたはURLを取得します:admin / process / some_id / ......このIDはプロセスに対応します

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

これは、cronジョブを変更する方法についての私の質問には答えません。また、これによりすべてのインデックスが再作成されます。変更された部分のインデックスを再作成したいだけです。
janw 2014

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 Beraの答えが一番好きでした-しかし、IDを配列に配置し、最も重要なことに最もスムーズな操作のために配置を変更しました。数値でまっすぐ実行すると、1つのインデックステーブルのインデックスを再作成すると、別のインデックステーブルが無効になる可能性があります。IEインデックスのproduct_flatテーブルの場合、価格によって製品のフラットテーブルが無効になり、再インデックスが必要になる場合があります。

<?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
ちなみに答えたのは@jimです。
dh47

0

M1チェックインデクサーステータス

ルートディレクトリで以下のコマンドを実行して、ステータスを確認します。

php shell/indexer.php --status

チェックインデクサーのルートディレクトリで以下のコマンドを実行します。

php shell/indexer.php info

cronjob:必要なものだけを再インデックスする方法。

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

例:6時間ごとに再インデックスを設定します

*_6_*_*_* php -f /home/magento/public_html/shell/indexer.php --reindex catalogsearch_fulltex
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.