EE 1.14.2 / CE 1.9.2块缓存更新具有非唯一的缓存键-前端显示重复的内容


18

当我升级到EE 1.14.2时,大多数事情进展顺利,但是当我开始检查各种前端页面时遇到了一个问题。我有一个包含几个子类别的目录节点,每个子类别上都有一个不同的静态块。升级后,缓存刷新后首先点击哪个页面,最终将显示在所有不同页面上。

我不知道在发布CE 1.9.2时是否会出现相同的问题,但是我想将解决方案放在这里,以供那些可能会发现相同问题的人使用。

更新:由于证实这里同样的问题在CE 1.9.2想出了


Answers:


11

由于这是EE,所以我可以利用Magento的支持,但我也自己解决了一些问题,以帮助解决问题并尽快获得解决方案。代码更改由Magento提供,因此可以将它们应用到实际的app / code / core文件中,尽管您始终可以在/ app / code / local中复制文件并在其中应用更改。

问题在于,1.14.2中添加的块缓存方法没有生成唯一的缓存键,因此,当我在类别控制器空间中使用了多个块时,生成的缓存键最终仅对第一个页面命中是唯一的,导致所有这些页面显示重复的内容。

解决方法是添加以下内容(以diff文件格式显示,以显示添加内容周围的上下文-只需在需要添加+的行中添加):

在第72行的app / code / core / Mage / Cms / Block / Block.php中:

         }
         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行的app / code / core / Mage / Cms / Block / Widget / Block.php中:

                 $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;
+    }
 }

我想我不会是唯一看到此问题的人,并且如果它在CE 1.9.2中出现,希望对某些人有帮助。


不幸的是,它没有进入昨天发布的CE 1.9.2中,因此升级后我在我们的一个客户网站上遇到了此问题。将尝试此修复程序。
马可·米尔腾堡

这对我
不起作用

10

我认为正确的方法是我们需要创建Custom模块,因为大家都知道Magento Boogieman会帮到您!如果改变核心:)

您将需要以下文件: 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/solved-magento-static-block-display-issue.html


为什么不将其打包在带有作曲器的模块中?
Aleksey Razbakov

我没有得到这个职位是太大反响,所以我认为没有身体想在模块
Bhupendra Jadeja

还没有人遇到这个问题。尚无人使用新的magento版本。如果我没有松节油模块的问题,我也不会使用它
Aleksey Razbakov

我添加了下载此模块的链接
Bhupendra Jadeja


4

CMS块缓存还有另一个问题,上面的给定代码无法解决。

如果您在CMS块中使用安全的url和{{media}}标签,则由于Magento提供了来自缓存的不安全链接,您将从浏览器收到“不安全内容警告”消息。

要解决此问题,您需要再添加一个缓存信息标签,如下所示:

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

1

也可以通过以下扩展名来修复此错误(无需编辑核心文件或重写块):

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

并且它还包含@AdvancedLogic提到的行,以避免不安全的内容警告:

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


这一点都不适合1个街区
Aleksey Razbakov

对于哪个街区?我不明白,请您更具体吗?
zitix

它只是一个静态块。没什么特别的。我什至认为这只是随机的块。html错误。似乎使用了错误的缓存。我不知道如何在这里更具体。
Aleksey Razbakov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.