문제

이 질문은 잠시 동안 나에게 다소 답이되지 않았으며, 어떻게 작동하는지에 대해 누군가에게서 확실한 대답을 얻고 싶습니다.

시나리오 :

Magento 1.14.2.1을 실행하면 모든 인덱서가 일정에 실행되도록 설정하고 부분적으로 (또는 완전히?) 인덱싱 할 때마다 enterprise_refresh_index를 실행하는 Magento Cron을 실행했습니다.

이 버전으로 업그레이드하기 전에 1.13.1을 실행하고 CRON을 사용하지 않았습니다. 나는 저장 에서 인덱서가 있고 인덱서를 실행해야 할 때마다 shell/indexer.php를 통해 또는 다음 코드 예제를 사용하여 수행 할 필요가있을 때마다 다음 코드 예제를 사용합니다.

// Example of indexers passed in:
$indexers = ['catalog_product_flat', 'catalog_category_flat'];

foreach ($indexers as $code) {
    $process = Mage::getSingleton('index/indexer')
                   ->getProcessByCode($code)
                   ->reindexEverything();
}
. 이전에

...

이것은 이전에 내가 원할 때 즉시 실행중인 인덱서가 실행되며, 다양한 변경 사항을 가질 때, 프론트 엔드 등에서 상대적으로 신속하게 전파 될 필요가있다.

분명히 우리는 교착 상태 / 테이블 잠금 문제와 인덱서가 여러 명의 관리자를 동시에 저장할 때 여러 명의 관리자를 저장할 때, 마그토 크론을 사용하여 새로운 "모범 사례"로 이동할 때 일정에 모두.

내 질문 :

  1. 제품 평면 Reindex (php shell/indexer.php --reindex catalog_product_flat)를 예정된 Cron 작업을 통해 이제 이제 이제로 교체하는 것은 어떻게 교체합니까? 내가 볼 수있는 것은 enterprise_refresh_index cron 직업을 실행할 수는 있지만 모든 인덱서 오른쪽 핸들이 핸들이 될 수 있다는 것입니다.
  2. 더 이상이 작업을 수행 할 필요가있는 것과 관련이 있습니까? 이것으로 이전 명령을 수행하면 Magento는 카탈로그 제품 플랫 영역 내에서 필요한 것을 인덱싱하고 예약 된 작업을 실행하여 모든 인덱서를 하나로 결합한 예정된 작업을 실행합니다. 이것이 사실이라면, 그것은 괜찮습니다 - 단지 이해하기 위해 혼란스러워합니다.
  3. 배경 :

    나는이 질문을 Magento EE 지원으로 물었다. 그들은 지원 계약의 영역 밖에 떨어지는 것이 아니라 Magento Devs 중 하나에서 여전히 답을 얻었으며 "데이터베이스의 변경 사항이 트리거로 감지되고 변경 로그 레코드가 생성되었음을 알려주는 것"이라고 답변했습니다. 나는 여기에서 예정된 인덱서 가이 변경 로그 레코드를 기반으로 수행 해야하는 것을 결정합니다.

    이전에 제품 평면 테이블 (모든 제품, 모든 것)을 다시 삭제 해야하는 경우 이전 예제로 명령 줄에서 수행 할 필요가 있다고 가정합니다. 어떻게 똑같은 것을 얻을 수 있습니다. 이제는 ChangeLogs를 통해 알아야합니다. enterprise_refresh_index를 통해 다른 모든 인덱서를 잡지 않고 제품 평면 데이터의 에 reindex ?

    나는 그것의 관련성을 생각하지 않지만, 우리는 cron이 무엇을하고 있는지에 대한 더 나은 통찰력을 제공하기 위해 Aoe_Scheduler 모듈을 사용합니다.


    나는 그것이 길다는 것을 알고 있습니다. 내가 조금 더 잘 요약 할 수 있는지 알려 주시기 바랍니다. 나는 확실한 대답을 얻는 데 운이 없으며 일부 관리자는 Magento Cron이 모든 것을 효과적으로 효과적으로 다시 인정하는 것을 확신하지 못합니다. 이런 종류의 진술이 이루어질 때, 나는 일반적으로 CLI의 모든 제품 평면 데이터를 다시 삭제하지만, 예정된 인덱서와의 충돌을 일으키기 때문에 나는 더 이상 할 수 없습니다.

도움이 되었습니까?

해결책

public function refreshIndex(Mage_Cron_Model_Schedule $schedule)
{
    /** @var $helper Enterprise_Index_Helper_Data */
    $helper = Mage::helper('enterprise_index');

    /** @var $lock Enterprise_Index_Model_Lock */
    $lock   = Enterprise_Index_Model_Lock::getInstance();

    if ($lock->setLock(self::REINDEX_FULL_LOCK)) {

        /**
         * Workaround for fatals and memory crashes: Invalidating indexers that are in progress
         * Successful lock setting is considered that no other full reindex processes are running
         */
        $this->_invalidateInProgressIndexers();

        $client = Mage::getModel('enterprise_mview/client');
        try {

            //full re-index
            $inactiveIndexes = $this->_getInactiveIndexersByPriority();
            $rebuiltIndexes = array();
            foreach ($inactiveIndexes as $inactiveIndexer) {
                $tableName  = (string)$inactiveIndexer->index_table;
                $actionName = (string)$inactiveIndexer->action_model->all;
                $client->init($tableName);
                if ($actionName) {
                    $client->execute($actionName);
                    $rebuiltIndexes[] = $tableName;
                }
            }

            //re-index by changelog
            $indexers = $helper->getIndexers(true);
            foreach ($indexers as $indexerName => $indexerData) {
                $indexTable = (string)$indexerData->index_table;
                $actionName = (string)$indexerData->action_model->changelog;
                $client->init($indexTable);
                if (isset($actionName) && !in_array($indexTable, $rebuiltIndexes)) {
                    $client->execute($actionName);
                }
            }

        } catch (Exception $e) {
            $lock->releaseLock(self::REINDEX_FULL_LOCK);
            throw $e;
        }

        $lock->releaseLock(self::REINDEX_FULL_LOCK);
    }

    return $this;
}
.

모든 CRON 실행에 대해 "항상"실행됩니다. 이는 필요한 인덱스에 대해 완전한 다시 인덱스를 실행하고 그렇지 않은 사용자를 위해 변경 로그를 처리합니다.

또한 CLI 셸 스크립트를 실행할 수 있지만 부분 변경 로그를 고려하지 않고 맹목적으로 전체 reindex를 수행합니다.

죽은 자물쇠를 가져 오는 경우 모든 인덱서를 Manual로 설정하고 대체 프로세스를 설정하여 피크 오프 시간 시간 (관리자가 멀리있을 때)에서 인덱스를 다시 작성할 수 있습니다. 제품 가격 만 주식 상태 을 저장하도록 설정해야합니다.

또한 index_process 테이블의 부분 재 인덱싱 상태가 더 이상 사용되지 않지만 enterprise_mview_metadata에서 계산됩니다.

Mage_Rss와 같은 내부 모듈을 비활성화하면 인덱스의 무효화 빈도에 영향을 미칠 수 있습니다.

추가 읽기 :

다른 팁

제쳐두고, 나는 최근에 Aoe_eeindexerstats 모듈에서 GitHub에서 AoePeople에서 모듈을 찍었습니다.인덱서 또는 전체 인덱서의 특정 부분을 제어 할 수있는 것처럼 보이는 것처럼 보입니다. 이는 모두 enterprise_refresh_index에서 모두 덮여 있습니다.이것은 잠재적으로 이전 프로세스와 동일 할 수 있습니다. 여기서 catalog_product_flat 색인을 자체적으로 대상으로 할 수 있습니다.

코드에서도 액세스 할 수 있어야합니다.

$client = Mage::getModel('enterprise_mview/client'); /* @var $client Enterprise_Mview_Model_Client */
$client->initByTableName($tablename);
$metadata = $client->getMetadata();
$metadata->setInvalidStatus();
$metadata->save();
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 magento.stackexchange
scroll top