cronjob: Làm thế nào để reindex chỉ những gì cần thiết


8

Chúng tôi có một máy chủ có 5 cửa hàng riêng biệt trên đó. Một số thực tế không hoạt động. Một số hoạt động hàng ngày. Để giảm tải máy chủ. Chúng tôi đã thay đổi chỉ số từ tự động sang thủ công. Sau đó, chúng tôi thiết lập một cronjob cứ sau 6 giờ. Tôi tìm thấy đủ các ví dụ về reindexing tất cả.

Chúng tôi chạy một cái gì đó như thế này ngay bây giờ:
Shop1: 0 0,6,12,18 * * * php -f /shell/indexer.php reindexall
Shop2: 0 1,7,13,19 * * * php -f /shell/indexer.php reindexall
vân vân, để tránh chồng chéo.

Ngay bây giờ các cửa hàng không hoạt động cũng reindex cứ sau 6 giờ mà không cần thiết. Có cách nào để chỉ reindex những gì cần thiết với một cronjob không?

Hay chúng ta đang làm sai hoàn toàn?

Câu trả lời:


3

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

Tôi phải nói rằng câu trả lời được đưa ra bởi @Fellingmana trên thực tế thông minh hơn nhiều so với của tôi;)
ProxiBlue

6

Những gì tôi biết, Index là một cái gì đó toàn cầu, do đó, một reindex luôn bao gồm tất cả các Cửa hàng / Trang web của một Magento.

Nhưng, Magento có một số chức năng bạn sẽ thích. Mặc dù "cập nhật trên Save" thực hiện các cập nhật để lập chỉ mục ngay lập tức, "cập nhật thủ công" sẽ đưa các "cập nhật" tương tự vào hàng đợi, mà bạn có thể kích hoạt sau này.

Đối với điều này, bạn sẽ cần phải viết kịch bản shell hoặc cron job của riêng bạn

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

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

Tôi sẽ không giải thích những điều cơ bản của các mô hình quy trình, chỉ cần nhìn vào hàm indexEvents, nó sẽ lấy các mục của hàng đợi và cập nhật chúng. Nhưng hãy cẩn thận, Chỉ mục URL có thể hơi chậm. Nhưng đó là một vấn đề khác.


1
Giải pháp thú vị, tôi không biết rằng các sự kiện được lưu khi "cập nhật thủ công" được kích hoạt. Điều này sẽ chỉ cho phép lập chỉ mục dữ liệu thay đổi.
Andreas von Studnitz

0

Để giới thiệu lại các quy trình, chúng tôi yêu cầu id của họ.
Đối với magento mặc định, có 9 quy trình để reindex, được đánh số từ 1 đến 9.

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

Đôi khi, có các quy trình từ các mô-đun tùy chỉnh của chúng tôi cũng yêu cầu reindexing Chúng tôi cần thêm các id đó vào mảng id hiện có của chúng tôi, Để biết id của quy trình, chỉ cần di chuột vào từng quy trình trong
admin panel-> System-> Index Management

Bạn sẽ nhận được một url: admin / process / some_id / ...... id này tương ứng với tiến trình

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

Điều này không trả lời câu hỏi của tôi làm thế nào để thay đổi cronjob. Ngoài ra điều này giới thiệu lại tất cả mọi thứ. Tôi chỉ muốn reindex những phần được thay đổi.
janw

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

Tôi thích câu trả lời của Amit Bera nhất - nhưng đã sửa đổi việc đặt id vào một mảng và quan trọng nhất là được sắp xếp để hoạt động trơn tru nhất. Nếu bạn chạy thẳng qua các con số lập chỉ mục lại, một bảng chỉ mục có thể khiến một bảng khác trở nên không hợp lệ. Bảng sản phẩm IE_flat sau đó giá có thể khiến bảng phẳng sản phẩm trở nên không hợp lệ và cần lập chỉ mục lại.

<?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
FYI của nó @jim người trả lời không amit.
dh47

0

Trạng thái chỉ mục kiểm tra M1

Chạy bên dưới lệnh trong thư mục gốc để kiểm tra trạng thái.

php shell/indexer.php --status

Chạy bên dưới lệnh trong thư mục gốc để kiểm tra chỉ mục.

php shell/indexer.php info

cronjob: Làm thế nào để reindex chỉ những gì cần thiết.

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

Ví dụ: Tôi đặt reindex cứ sau 6 giờ

*_6_*_*_* php -f /home/magento/public_html/shell/indexer.php --reindex catalogsearch_fulltex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.