スケジュール時にインデクサーを強制する方法
-
13-12-2019 - |
質問
この質問は今の間私のためにやや未解決していました、そして私はそれがどのように機能するかについて誰かから決定的な答えを得たいです。
シナリオ:
Magento 1.14.2.1を実行すると、スケジュールで実行するようにすべてのインデクサーを設定し、何でも(または完全に)インデックスされている必要があるときはいつでもenterprise_refresh_index
を実行するMagento Cronを実行します。
このバージョンへのアップグレードの前に、私は1.13.1を実行していて、Cronを使用していませんでした。インデクサーが save に設定されているように設定されていましたが、インデクサーの実行を実行する必要があるときはいつでも私は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();
}
.
以前...
これまでに延長されているインデクサーが、それらを望んでいたときに即座に走行しているという点で、前に走行し、フロントエンドなどに比較的早く伝播するという点で罰金をかけました。
明らかに、私たちがデッドロック/テーブルロックの問題とinsestersとincestersと競合するインデックス担当者が同時に複数の管理者を保存したときに、それゆえ、Magento Cronを処理するための新しい「ベストプラクティス」への移行それはすべてスケジュールで。
私の質問:
- スケジュールされたCronジョブを通して、今すぐ同等の製品フラットReIndex(
php shell/indexer.php --reindex catalog_product_flat
)を強制する古いスタイルをどのように置き換えますか。私が見ることができるのは、enterprise_refresh_index
Cronジョブを実行できるのですが、すべてのインデクサー right - 特定の部分を単一にすることはできませんか? - これ以上これ以上行う必要がありますか?これによって、その前のコマンドを実行することによって、マゼントはまだカタログ製品フラットレルムの中に必要なものだけを索引付けし、スケジュールされたタスクを実行することによって、すべてのインデクサナを1つに組み合わせることによって。これが事実であるならば、それは素晴らしいです - それは理解するのは非常に混乱しています。
背景:
マゼントEEサポートでこの質問をしました。彼らはそれがサポート契約の領域外に陥ると言うために戻ってきましたが、Magento Devsの1つからの答えを持っていて、「データベースへの変更はトリガーで検出され、ChangeLogレコードが作成されました」と言って私に返信しました。ここから、スケジュールされたインデクサーは、それらのChangeLogレコードに基づいて何をする必要があるかを決定することを理解しています。
私は以前に製品フラットテーブル(すべての製品、すべて)を再インデックスする必要がある場合は、前の例としてコマンドラインからそれをするだろうと想定されています。それが知っているものだけを変更するのであれば、私は今やChangeLogsを介して行うべきであるならば、同じことを達成するのですか? enterprise_refresh_index
を介して他のすべてのインデクサーを介して他のすべてのインデクサーをキャッチすることなく、製品フラットデータの All を再インデックスする方法がありますか?
私はその関連性は考えませんが、私たちは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 - quick一目で、それはあなたが索引身または索引の特定のインデクサーの特定の部分を制御することを可能にするように見えます。これはすべて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();
.