Pembaruan caching blok EE 1.14.2 / CE 1.9.2 memiliki kunci cache yang tidak unik - duplikat konten ditampilkan di frontend


18

Ketika saya memutakhirkan ke EE 1.14.2, kebanyakan hal berjalan dengan lancar tetapi saya menemukan masalah ketika saya mulai memeriksa berbagai halaman muka saya. Saya memiliki simpul katalog dengan beberapa subkategori dan masing-masing memiliki blok statis yang berbeda pada mereka. Setelah pemutakhiran, halaman mana yang dipukul pertama setelah cache flush akan muncul pada semua halaman yang berbeda.

Saya tidak tahu apakah masalah yang sama ini akan hadir ketika CE 1.9.2 dirilis tetapi saya ingin menempatkan solusi saya di sini untuk mereka yang mungkin menemukan masalah yang sama ini.

UPDATE: Sebagaimana dikonfirmasi di sini masalah yang sama muncul pada CE 1.9.2


Jawaban:


11

Karena ini adalah EE, saya dapat memanfaatkan dukungan Magento tetapi saya juga menyelesaikannya sendiri untuk membantu memfokuskan masalah dan mendapatkan solusi secepat mungkin. Perubahan kode disediakan oleh Magento sehingga menerapkannya ke file aplikasi / kode / inti yang sebenarnya baik-baik saja meskipun Anda selalu dapat menduplikasi file di / app / kode / lokal Anda dan menerapkan perubahan di sana.

Masalahnya adalah bahwa metode caching blok yang ditambahkan pada 1.14.2 tidak menghasilkan kunci cache yang unik sehingga ketika saya memiliki beberapa blok yang digunakan dalam ruang pengontrol kategori, kunci cache yang dihasilkan hanya menjadi unik untuk klik halaman pertama, menghasilkan semua halaman tersebut untuk menampilkan konten duplikat.

Cara mengatasinya adalah dengan menambahkan yang berikut ini (ditampilkan dalam format file berbeda untuk menunjukkan konteks di sekitar penambahan - cukup tambahkan baris dengan tanda + di mana mereka harus pergi):

Di app / code / core / Mage / Cms / Block / Block.php pada baris 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;
+    }
 }

Dalam aplikasi / kode / inti / Penyihir / Cms / Blok / Widget / Block.php pada baris 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;
+    }
 }

Saya tidak berpikir saya akan menjadi satu-satunya yang melihat masalah ini dan jika muncul di CE 1.9.2, mudah-mudahan ini akan membantu menyelesaikannya untuk beberapa orang.


Sayangnya itu tidak membuatnya menjadi CE 1.9.2 yang dirilis kemarin jadi saya mengalami masalah ini di salah satu situs web klien kami setelah upgrade. Akan mencoba perbaikan ini.
Marco Miltenburg

ini tidak berfungsi untuk saya
Pixelomo

10

Saya pikir cara yang tepat adalah kita perlu membuat modul Kustom karena Anda semua tahu bahwa Magento Boogieman akan mendapatkan Anda! jika mengubah inti :)

Anda harus mengikuti file-file berikut: 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;
   }
}

Untuk informasi lebih lanjut, Anda dapat mengunjungi blog berikut dan Anda juga dapat mengunduhnya https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html


kenapa tidak kamu kemas dalam modul dengan komposer?
Aleksey Razbakov

Saya tidak mendapatkan banyak tanggapan terhadap posting ini jadi saya pikir tidak ada orang yang menginginkannya dalam modul
Bhupendra Jadeja

belum ada yang punya masalah ini. belum ada yang menggunakan versi magento baru. saya juga tidak akan menggunakannya jika saya tidak punya masalah dengan modul terpentin
Aleksey Razbakov

Saya telah menambahkan tautan untuk mengunduh modul ini
Bhupendra Jadeja

itu akan keren untuk memilikinya di github dengan modman dan komposer seperti github.com/progammer-rkt/Rkt_SbCache
Aleksey Razbakov

4

Ada satu lagi masalah dengan caching blok CMS, yang tidak diperbaiki dengan kode yang diberikan dari atas.

Jika Anda menggunakan url aman dan tag {{media}} di blok CMS Anda, Anda akan menerima pesan "Peringatan konten tidak aman" dari browser, karena Magento menyajikan tautan tidak aman dari cache.

Untuk mengatasinya, Anda perlu menambahkan satu tag info cache lagi, sebagai

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

1

Bug ini juga dapat diperbaiki dengan ekstensi kecil ini (tidak perlu mengedit file inti atau menulis ulang blok):

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

Dan itu juga berisi baris yang disebutkan oleh @AdvancedLogic untuk menghindari peringatan konten yang tidak aman:

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


ini tidak berhasil untuk 1 blok, entah bagaimana
Aleksey Razbakov

Untuk blok mana? Saya tidak mengerti, bisakah Anda lebih spesifik?
zitix

Ini hanya satu blok statis. Tidak ada yang khusus. Saya bahkan berpikir itu hanya blok acak. Ada html yang salah. Sepertinya cache yang salah untuk blok ini digunakan. Saya tidak tahu bagaimana menjadi lebih spesifik di sini.
Aleksey Razbakov
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.