cronjob: Cara mengindeks ulang hanya apa yang dibutuhkan

8

Kami mendapat server yang memiliki 5 toko terpisah. Beberapa di antaranya praktis tidak aktif. Beberapa aktif setiap hari. Untuk mengurangi beban server. Kami mengubah indeks dari otomatis ke manual. Lalu kami mengatur cronjob setiap 6 jam. Saya menemukan cukup contoh dari Mengindeks ulang semua.

Kami menjalankan sesuatu seperti ini sekarang:
Shop1: 0 0,6,12,18 * * * php -f /shell/indexer.php reindexall
Shop2: 0 1,7,13,19 * * * php -f /shell/indexer.php reindexall
dan seterusnya, untuk menghindari tumpang tindih.

Saat ini toko-toko yang tidak aktif juga memasang kembali setiap 6 jam di mana tidak ada yang diperlukan. Apakah ada cara untuk hanya mengindeks ulang apa yang dibutuhkan dengan cronjob?

Atau apakah yang kita lakukan salah sama sekali?

janw
sumber

Jawaban:

3

Yang Anda inginkan adalah membuat skrip shell CLI, dan menggunakannya untuk menentukan apakah indeks memerlukan indeks ulang.

Lihat skrip di folder shell (log.php akan baik-baik saja) sebagai contoh tentang cara membuat skrip tersebut.

Script yang Anda buat kemudian akan memeriksa status indeks, dan hanya mengindeks ulang jika berada dalam status yang memerlukan pengindeksan.

Saya biasanya membuat skrip shell khusus saya di folder bernama / skrip, karena saya tidak suka mencemari shell folder inti dengan kode kustom saya.

Untuk efek ini, saya memiliki kelas abstrak yang mendasari semua skrip saya, dan berisi kode yang memungkinkan saya untuk dengan mudah mengindeks ulang pengindeks jika mereka membutuhkan pengindeksan.

di sini adalah kelas abstrak saya:

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

}

Kemudian kelas yang didasarkan itu, yang memanggil indeks ulang, setelah beberapa pekerjaan dilakukan.

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();
ProxiBlue
sumber
Saya harus mengatakan jawaban yang diberikan oleh @Flyingmana sebenarnya jauh lebih pintar daripada saya sendiri;)
ProxiBlue
6

Yang saya tahu, Indeks adalah sesuatu yang global, jadi indeks ulang selalu mencakup semua Toko / Situs Web dari satu Magento.

Tetapi, Magento memiliki beberapa fungsi yang Anda sukai. Sementara "perbarui pada Simpan" melakukan pembaruan untuk mengindeks instan, "pembaruan manual" menempatkan "pembaruan" yang sama ke dalam antrian, yang dapat Anda picu nanti.

Untuk ini, Anda harus menulis skrip shell atau pekerjaan cron Anda sendiri

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

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

Saya tidak akan menjelaskan dasar-dasar model proses, cukup melihat fungsi indexEvents, dibutuhkan entri antrian dan memperbaruinya. Tapi hati-hati, Indeks URL bisa agak lambat. Tapi itu masalah lain.

Flyingmana
sumber
1
Solusi menarik, saya tidak tahu bahwa acara tersebut disimpan ketika "pembaruan manual" diaktifkan. Ini akan memungkinkan pengindeksan hanya data yang diubah.
Andreas von Studnitz
0

Untuk mengindeks ulang proses kami membutuhkan id mereka.
Untuk magento default ada 9 proses untuk mengindeks ulang, bernomor 1 hingga 9.

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

Kadang-kadang ada proses dari modul khusus kami yang juga memerlukan pengindeksan ulang Kami perlu menambahkan id ke array id yang ada, Untuk mengetahui id proses, cukup arahkan pada setiap proses di
admin panel-> System-> Index Management

Anda akan mendapatkan url: admin / process / some_id / ...... id ini sesuai dengan proses

$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();
   }
}
Deepak Mallah
sumber
Ini tidak menjawab pertanyaan saya bagaimana cara mengubah cronjob. Ini juga mengindeks ulang segalanya. Saya hanya ingin mengindeks ulang bagian yang diubah.
januari
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();
        }
    }
    ?>
Jrossi
sumber
0

Saya menyukai jawaban Amit Bera yang terbaik - tetapi memodifikasi penempatan id dalam sebuah array dan yang paling penting diatur untuk operasi yang paling lancar. Jika Anda menjalankan langsung melalui angka pengindeksan ulang satu tabel indeks dapat menyebabkan yang lain menjadi tidak valid. IE Index product_flat table maka harga dapat menyebabkan flat table produk menjadi tidak valid dan perlu diindeks ulang.

<?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();
  }
}
Dan Tupper
sumber
2
FYI @jim-nya yang jawab tidak mau.
Dh47
0

M1 memeriksa status pengindeks

Jalankan perintah di bawah ini di direktori root untuk memeriksa status.

php shell/indexer.php --status

Jalankan perintah di bawah ini di direktori root untuk memeriksa pengindeks.

php shell/indexer.php info

cronjob: Cara mengindeks ulang hanya apa yang dibutuhkan.

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

Sebagai contoh: Saya mengatur reindex setiap 6 jam

*_6_*_*_* php -f /home/magento/public_html/shell/indexer.php --reindex catalogsearch_fulltex
Baharuni Asif
sumber