سؤال

لم يتم الرد على هذا السؤال إلى حد ما بالنسبة لي لفترة من الوقت الآن ، وأود الحصول على إجابة محددة من شخص ما حول كيفية عمله.

السيناريو:

تشغيل الماجنتو 1.14.2.1 ، لقد وضعت كل ما عندي من المفهرسين لتشغيل في الموعد المحدد ، وأنا تشغيل الماجنتو كرون الذي يدير enterprise_refresh_index كلما أي شيء يحتاج إلى أن يكون جزئيا (أو كليا?) مفهرسة.

قبل الترقية إلى هذا الإصدار ، كنت أقوم بتشغيل 1.13.1 ولم أكن أستخدم كرون.كان لدي مفهرسون على وشك أن يكونوا على حفظ, ، وكلما احتجت إلى إجبار أي من المفهرسين على الجري ، سأفعل ذلك إما عبر 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. كيف يمكنك استبدال النمط القديم لإجبار إعادة فهرسة مسطحة المنتج (php shell/indexer.php --reindex catalog_product_flat) مع ما يعادل الآن من خلال وظيفة كرون المقرر?كل ما يمكنني رؤيته هو أنه يمكنك الركض enterprise_refresh_index وظيفة كرون, لكن هذا يعالج جميع المفهرسين الحق-لا القدرة على واحد من أجزاء معينة?
  2. هل هو حتى ذات الصلة في حاجة إلى القيام بذلك أي أكثر?أعني بذلك أنه من خلال القيام بذلك الأمر السابق, أن الماجنتو لا تزال فهرستها فقط ما يلزم لداخل عالم كتالوج المنتج شقة, وعن طريق تشغيل المهمة المجدولة يفعل الشيء نفسه ولكن يجمع بين جميع المفهرسين في واحد?إذا كان هذا هو الحال ، فلا بأس - إنه أمر محير للغاية لفهمه.

معلومات أساسية:

لقد سألت هذا السؤال مع دعم الماجنتو هه.عادوا ليقولوا إنه يقع خارج نطاق اتفاقيات الدعم ، لكنهم ما زالوا يحصلون على إجابة من أحد مطوري الماجنتو وأجابوا لي قائلا: "يتم اكتشاف التغييرات في قاعدة البيانات باستخدام المشغلات وإنشاء سجلات التغيير."أفهم أنه من هنا ، يقرر المفهرس المجدول ما يجب القيام به بناء على سجلات التغيير هذه.

لقد افترضت سابقا أنه إذا كنت بحاجة إلى إعادة فهرسة الجداول المسطحة للمنتج (جميع المنتجات ، كل شيء) ، فسأفعل ذلك من سطر الأوامر كمثال سابق.كيف يمكنني تحقيق نفس الشيء الآن اذا كان الذهاب الى إعادة فهرسة فقط تلك التي يعرف ينبغي القيام به عن طريق التغيير?هل هناك طريقة لإعادة الفهرسة الكل من بيانات المنتج المسطحة دون اصطياد جميع المفهرسين الآخرين معها عبر enterprise_refresh_index?

أنا لا أعتقد أنها ذات صلة ، ولكن نستخدم وحدة أويشدولر لإعطاء نظرة أفضل على ما يفعله كرون.


أعلم أنها طويلة.واسمحوا لي أن أعرف ما إذا كان يمكنني تلخيص أفضل قليلا.لم يكن لدي أي حظ في الحصول على إجابة نهائية ، وبعض المستخدمين المشرف غير مقتنعين بأن الماجنتو كرون هو إعادة فهرسة كل شيء على نحو فعال في كل مرة.عندما يتم هذا النوع من البيان ، كنت عادة إعادة فهرسة جميع البيانات المسطحة المنتج من كلي ، ولكن لا أستطيع أن أفعل ذلك بعد الآن لأنه يسبب الصراعات مع المفهرس المقرر وجميع الجحيم يكسر فضفاضة.

هل كانت مفيدة؟

المحلول

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، لكنها لن تأخذ في الاعتبار سجل التغيير الجزئي وستقوم بإعادة فهرسة كاملة بشكل أعمى.

إذا كنت تحصل على أقفال ميتة، فقد ترغب في ضبط كافة الفهارس الخاصة بك على Manual وإعداد عمليات بديلة لإعادة بناء الفهرس في ساعات خارج أوقات الذروة (عندما يكون المسؤولون بعيدًا).فقط أسعار المنتجات و حالة الرصيد، وضع مخزون يجب ضبطه على التحديث عند الحفظ.

ضع في اعتبارك أيضًا أنه مع حالة إعادة الفهرسة الجزئية في index_process لم يعد يستخدم الجدول بعد الآن ولكن يتم حسابه من enterprise_mview_metadata.

تعطيل بعض الوحدات الداخلية مثل Mage_Rss يمكن أن يساعد أيضًا في التأثير على تكرار إبطال الفهارس.

قراءة متعمقة:

نصائح أخرى

باعتبارها جانبا ، جئت مؤخرا عبر إيو_إيندكسرستاتس وحدة من أويبوبل على جيثب - من لمحة سريعة يبدو أنها سوف تسمح لك للسيطرة على أجزاء معينة من المفهرسة أو المفهرسة كلها ، والتي يتم تغطيتها جميعا تحت 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