EE 1.14.2 / CE 1.9.2 ब्लॉक कैशिंग अपडेट में गैर-अद्वितीय कैश कुंजियाँ हैं - डुप्लिकेट सामग्री दृश्यपटल पर दिखाई दे रही है


18

जब मैंने ईई 1.14.2 में अपग्रेड किया, तो ज्यादातर चीजें सुचारू रूप से चली गईं, लेकिन जब मैं अपने विभिन्न फ्रंटएंड पृष्ठों की जांच करना शुरू किया तो मुझे एक मुद्दा मिला। मेरे पास कई उपश्रेणियों के साथ एक कैटलॉग नोड है और उनमें से प्रत्येक पर एक अलग स्थिर ब्लॉक है। अपग्रेड के बाद, कैश पेज फ्लश करने के बाद जो भी पेज पहले हिट किया गया था, वह सभी अलग-अलग पेज पर दिखाई देगा।

मुझे नहीं पता कि सीई 1.9.2 जारी होने पर यह वही मुद्दा मौजूद होगा या नहीं, लेकिन मैं अपना समाधान उन लोगों के लिए यहां रखना चाहता हूं जो इसी मुद्दे को ढूंढ सकते हैं।

अद्यतन: जैसा कि यहाँ पुष्टि की गई है कि सीई 1.9.2 में भी यही समस्या सामने आई है


जवाबों:


11

चूंकि यह ईई था, मैं मैगेंटो समर्थन का उपयोग करने में सक्षम था, लेकिन मैंने इस मुद्दे पर ध्यान केंद्रित करने और जितनी जल्दी हो सके एक समाधान प्राप्त करने में मदद करने के लिए अपने दम पर काम किया। मैगेंटो द्वारा कोड परिवर्तन प्रदान किए गए थे, इसलिए उन्हें वास्तविक ऐप / कोड / कोर फ़ाइलों पर लागू करना ठीक है, हालांकि आप हमेशा अपने / ऐप / कोड / स्थानीय में फ़ाइलों की नकल कर सकते हैं और वहां परिवर्तन लागू कर सकते हैं।

मुद्दा यह था कि 1.14.2 में जो ब्लॉक कैशिंग विधि जोड़ी गई थी, वह एक अद्वितीय कैश कुंजी उत्पन्न नहीं कर रही थी, इसलिए जब मुझे श्रेणी नियंत्रक स्थान में कई ब्लॉक का उपयोग किया गया था, तो उत्पन्न कैश कुंजी पहले पृष्ठ के हिट के लिए केवल अद्वितीय होने के कारण समाप्त हो गई थी, डुप्लिकेट सामग्री दिखाने के लिए उन सभी पृष्ठों के परिणामस्वरूप।

निम्नलिखित को जोड़ने के लिए फिक्स था (परिवर्धन के आसपास के संदर्भ को दिखाने के लिए अलग फ़ाइल प्रारूप में प्रदर्शित - बस उन पंक्तियों में + के साथ जोड़ें जहां उन्हें जाने की आवश्यकता है):

एप्लिकेशन / कोड / कोर / दाना / सेमी / ब्लॉक / ब्लॉक में। 72 पर लाइन:

         }
         return $html;
     }
+
+    /**
+     * Retrieve values of properties that unambiguously identify unique content
+     *
+     * @return array
+     */
+    public function getCacheKeyInfo()
+    {
+        $blockId = $this->getBlockId();
+        if ($blockId) {
+            $result = array(
+                $blockId,
+                Mage::app()->getStore()->getCode(),
+            );
+        } else {
+            $result = parent::getCacheKeyInfo();
+        }
+        return $result;
+    }
 }

एप्लिकेशन / कोड / कोर / दाना / सीएमएस / ब्लॉक / विजेट / ब्लॉक में। लाइन 82 पर:

                 $helper = Mage::helper('cms');
                 $processor = $helper->getBlockTemplateProcessor();
                 $this->setText($processor->filter($block->getContent()));
+                $this->addModelTags($block);
             }
         }

         unset(self::$_widgetUsageMap[$blockHash]);
         return $this;
     }
+
+    /**
+     * Retrieve values of properties that unambiguously identify unique content
+     *
+     * @return array
+     */
+    public function getCacheKeyInfo()
+    {
+        $result = parent::getCacheKeyInfo();
+        $blockId = $this->getBlockId();
+        if ($blockId) {
+            $result[] = $blockId;
+        }
+        return $result;
+    }
 }

मुझे नहीं लगता कि मैं इस मुद्दे को देखने के लिए केवल एक ही होगा और अगर यह सीई 1.9.2 में दिखाई देता है, तो उम्मीद है कि यह कुछ लोगों के लिए इसे हल करने में मदद करेगा।


दुर्भाग्य से इसे सीई 1.9.2 में नहीं बनाया गया था जो कल जारी किया गया था इसलिए मैं उन्नयन के बाद हमारे ग्राहकों की वेबसाइटों में से एक में इस मुद्दे पर भाग गया। यह ठीक करने की कोशिश करेंगे।
मार्को मिल्टेनबर्ग

यह मेरे लिए काम नहीं कर रहा है
Pixelomo

10

मुझे लगता है कि उचित तरीका है कि हमें कस्टम मॉड्यूल बनाने की आवश्यकता है क्योंकि आप सभी जानते हैं कि मैगेंटो बूगीमैन आपको मिलेगा! अगर कोर बदलो :)

आपको निम्न फ़ाइलों की आवश्यकता होगी: app/etc/modules/Bhupendra_Cms.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Bhupendra_Cms>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Cms/>
            </depends>
        </Bhupendra_Cms>
    </modules>
</config>

app/code/local/Bhupendra/Cms/etc/config.xml

<?xml version="1.0"?>
<config>
        <modules>
            <Bhupendra_Cms>
                <version>1.0.0</version>
            </Bhupendra_Cms>
        </modules>
        <global>
            <blocks>
                <cms>
                    <rewrite>
                        <block>Bhupendra_Cms_Block_Block</block>
                        <widget_block>Bhupendra_Cms_Block_Widget_Block</widget_block>
                    </rewrite>
                </cms>
            </blocks>
        </global>
</config>

app/code/local/Bhupendra/Cms/Block/Block.php

<?php
class Bhupendra_Cms_Block_Block extends Mage_Cms_Block_Block {

   public function getCacheKeyInfo()
    {

      $blockId = $this->getBlockId();
      if ($blockId) {
            $result = array(
                $blockId,
                Mage::app()->getStore()->getCode(),
            );
      } else {
           $result = parent::getCacheKeyInfo();
       }
       return $result;
   }

}

app/code/local/Bhupendra/Cms/Block/Widget/Block.php

class Bhupendra_Cms_Block_Widget_Block extends Mage_Cms_Block_Widget_Block
{
       /**
     * Storage for used widgets
     *
     * @var array
     */
    static protected $_widgetUsageMap = array();

    /**
     * Prepare block text and determine whether block output enabled or not
     * Prevent blocks recursion if needed
     *
     * @return Mage_Cms_Block_Widget_Block
     */
    protected function _beforeToHtml()
    {
        parent::_beforeToHtml();
        $blockId = $this->getData('block_id');
        $blockHash = get_class($this) . $blockId;

        if (isset(self::$_widgetUsageMap[$blockHash])) {
            return $this;
        }
        self::$_widgetUsageMap[$blockHash] = true;

        if ($blockId) {
            $block = Mage::getModel('cms/block')
                ->setStoreId(Mage::app()->getStore()->getId())
                ->load($blockId);
            if ($block->getIsActive()) {
                /* @var $helper Mage_Cms_Helper_Data */
                $helper = Mage::helper('cms');
                $processor = $helper->getBlockTemplateProcessor();
                $this->setText($processor->filter($block->getContent()));
                $this->addModelTags($block);
            }
        }

        unset(self::$_widgetUsageMap[$blockHash]);
        return $this;
    }

     /**
     * Retrieve values of properties that unambiguously identify unique content
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        $result = parent::getCacheKeyInfo();
        $blockId = $this->getBlockId();
        if ($blockId) {
            $result[] = $blockId;
       }
        return $result;
   }
}

अधिक जानकारी के लिए आप निम्नलिखित ब्लॉग पर जा सकते हैं और आप इसे https://www.milople.com/blogs/ecommerce/solve-magento-static-block-display-issue.html से भी डाउनलोड कर सकते हैं


आप इसे संगीतकार के साथ मॉड्यूल में क्यों नहीं पैक करते हैं
एल्पसे रज़बकोव

मुझे इस पोस्ट पर उतनी प्रतिक्रिया नहीं मिली, इसलिए मैंने सोचा कि कोई भी बॉडी इसे मॉड्यूल में नहीं चाहता है
भूपेंद्र जडेजा

अभी तक किसी को भी यह समस्या नहीं थी। कोई भी नए मैगेंटो संस्करण का उपयोग नहीं करता है। अगर मैं तारपीन मॉड्यूल के साथ समस्या नहीं था, तो मैं इसका इस्तेमाल नहीं
करूंगा

मैंने इस मॉड्यूल को डाउनलोड करने के लिए लिंक जोड़ा है
भूपेंद्र जडेजा

यह github में इसे modman और कंपोज़र जैसे github.com/progammer-rkt/Rkt_SbCache
Aleksey Razbakov

4

CMS ब्लॉक कैशिंग के साथ एक और समस्या है, जो ऊपर से दिए गए कोड के साथ तय नहीं है।

यदि आप अपने CMS ब्लॉक में सुरक्षित यूआरएल और {{मीडिया}} टैग का उपयोग कर रहे हैं, तो आपको ब्राउज़र से "असुरक्षित सामग्री चेतावनी" संदेश प्राप्त होगा, क्योंकि Magento कैश से असुरक्षित लिंक प्रदान करता है।

इसे हल करने के लिए, आपको एक और कैश जानकारी टैग जोड़ने की आवश्यकता है, जैसा कि

(int)Mage::app()->getStore()->isCurrentlySecure(),

1

इस बग को इस छोटे से एक्सटेंशन के साथ भी ठीक किया जा सकता है (कोर फ़ाइलों को संपादित करने की आवश्यकता नहीं है और न ही ब्लॉक को फिर से लिखना है))

https://github.com/progammer-rkt/Rkt_SbCache

और इसमें असुरक्षित सामग्री चेतावनी से बचने के लिए @AdvancedLogic द्वारा उल्लिखित लाइन भी शामिल है:

(int)Mage::app()->getStore()->isCurrentlySecure()


यह किसी भी तरह 1 ब्लॉक के लिए काम नहीं किया
अलेक्सी रेज़ाकोव

किस ब्लॉक के लिए? मुझे समझ नहीं आ रहा है, क्या आप अधिक विशिष्ट हो सकते हैं, कृपया?
झट

यह सिर्फ एक स्थिर ब्लॉक है। कुछ भी विशिष्ट नहीं। मैंने भी सोचा था कि यह सिर्फ यादृच्छिक ब्लॉक था। गलत html था। ऐसा लग रहा था कि इस ब्लॉक के लिए गलत कैश का इस्तेमाल किया गया था। मुझे नहीं पता कि यहां और अधिक विशिष्ट कैसे हो सकता है।
अलेक्सी रेज़ाकोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.