Problem buforowania bloków CMS w EE 1.14.2


15

Mam problem, który wydaje się być związany z buforowaniem bloków statycznych CMS.

Mam stronę cms i na tej stronie renderuję kilka bloków statycznych cms. Uproszczona wersja zawartości strony CMS wygląda następująco:

<div class="cms-block-1">{{block type="cms/block" block_id="banner_home"}}</div> 
<div class="cms-block-2">{{block type="cms/block" block_id="promo_home_1_1"}}</div> 
<div class="cms-block-3">{{block type="cms/block" block_id="promo_home_1_2"}}</div> 
<div class="cms-block-4">{{block type="cms/block" block_id="promo_home_2_1"}}</div> 
<div class="cms-block-5">{{block type="cms/block" block_id="promo_home_2_2"}}</div> 
<div class="cms-block-6">{{block type="cms/block" block_id="promo_home_2_3"}}</div> 
<div class="cms-block-7">{{block type="cms/block" block_id="promo_home_3_1"}}</div> 
<div class="cms-block-8">{{block type="cms/block" block_id="promo_home_3_2"}}</div>

Strona ładuje się zgodnie z oczekiwaniami natychmiast po wyczyszczeniu pamięci podręcznej bloków, strona wygląda mniej więcej tak:

<div class="cms-block-1">banner content</div> 
<div class="cms-block-2">promo_home_1_1 content</div> 
<div class="cms-block-3">promo_home_1_2 content</div> 
<div class="cms-block-4">promo_home_2_1 content</div> 
<div class="cms-block-5">promo_home_2_2 content</div> 
<div class="cms-block-6">promo_home_2_3 content</div> 
<div class="cms-block-7">promo_home_3_1 content</div> 
<div class="cms-block-8">promo_home_3_1 content</div>

Jednak po początkowym załadowaniu strony każde kolejne ładowanie strony jest niepoprawne. To wygląda tak:

<div class="cms-block-1">banner content</div> 
<div class="cms-block-2">promo_home_1_1 content</div> 
<div class="cms-block-3">promo_home_1_2 content</div> 
<div class="cms-block-4">promo_home_1_1 content</div> 
<div class="cms-block-5">promo_home_1_2 content</div> 
<div class="cms-block-6">promo_home_2_1 content</div> 
<div class="cms-block-7">promo_home_2_2 content</div> 
<div class="cms-block-8">promo_home_2_3 content</div>

W drugim przykładzie widać, że pierwsze dwa promocje są poprawne, jednak wszystko po tym wyświetla nieprawidłową treść dla block_id. Ponadto blok promo_home_1_1 i promo_home_1_2 są renderowane dwukrotnie, a promo_home_3_1 i promo_home_3_2 nigdy nie są renderowane. To tak, jakby mapowanie między block_id a powiązaną z nim statyczną zawartością bloku zostało w jakiś sposób pomieszane. Jest to związane z buforowaniem, ponieważ jeśli blokowanie pamięci podręcznej bloków nie jest włączone, to nie widzę już problemu.

Warto również zauważyć, że ta strona działała na EE 1.13, jednak po aktualizacji do EE 1.14.2 problem zaczął występować.

Zdaję sobie sprawę, że ciężko jest powiedzieć, co jest nie tak, nie wiedząc, co jeszcze dzieje się w systemie, ale mam nadzieję, że ktoś może dać mi przynajmniej trochę więcej wskazówek, ponieważ brakuje mi pomysłów.

Aktualizacja:

Próbowałem też tego z widżetami, np

<div class="cms-block-1">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="63"}}</div>
<div class="cms-block-2">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="64"}}</div>
<div class="cms-block-3">{{widget type="cms/widget_block" template="cms/widget/static_block/default.phtml" block_id="65"}}</div>

W tym przypadku wszystkie 3 bloki zwróciły tę samą treść, mimo że identyfikatory wskazują różne bloki w bazie danych. Po wyczyszczeniu pamięci podręcznej zwracany blok czasami się zmienia, ale wszystkie trzy widżety nadal będą miały tę samą zawartość.


czy byłeś w stanie rozwiązać to dla widżetów?
Siergiej Guk,

Tak naprawdę nie miałem tego problemu, więc nie, ale wygląda na to, że Mage_Cms_Block_Widget_Block może mieć ten sam problem i dlatego takie samo rozwiązanie
Andrew Kett

Odpowiedzi:


5

Ok, więc znalazłem przyczynę tego problemu i wydaje się, że jest to problem w rdzeniu Magento.

W Magento 1.14.2 dodano nową metodę _construct do Mage_Cms_Block_Block, która zawiera następujący kod.

/**
 * Initialize cache
 *
 * @return null
 */
protected function _construct()
{
    /*
    * setting cache to save the cms block
    */
    $this->setCacheTags(array(Mage_Cms_Model_Block::CACHE_TAG));
    $this->setCacheLifetime(false);
}

To skutecznie włącza buforowanie dla bloków cms. Klucz pamięci podręcznej nie jest ustawiony, więc wraca do Mage_Core_Block_Abstract :: getCacheKeyInfo, która używa nazwy bloku w układzie. W tym przypadku tak naprawdę nie używamy pliku xml układu, aby dodać blok i nie ma ustawionej nazwy. Magento wydaje się próbować sobie z tym poradzić, ustawiając coś takiego jak ANONYMOUS_78 jako nazwę. Jednak z jakiegoś powodu nie działa to w 100%, stąd duplikaty, które widziałem.

Moim rozwiązaniem było zastąpienie klasy Mage_Cms_Block_Block we własnym rozszerzeniu i dodanie nowej metody, aby ustawić klucz pamięci podręcznej jawnie na identyfikator bloku, a nie na przypisaną wartość. Klasa wygląda następująco:

/**
 * Override cms/block to add cache key. This started being a problem as of EE 1.14.2 when the _construct
 * method was added which turns on caching for cms blocks
 */
class Mysite_Cms_Block_Block extends Mage_Cms_Block_Block
{

    /**
     * If this block has a block id, use that as the cache key.
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        if ($this->getBlockId()) {
            return array(
                Mage_Cms_Model_Block::CACHE_TAG,
                Mage::app()->getStore()->getId(),
                $this->getBlockId(),
                (int) Mage::app()->getStore()->isCurrentlySecure()
            );
        } else {
            return parent::getCacheKeyInfo();
        }
    }
}

Wydaje się, że to rozwiązało problem.

Aktualizacja:

Wygląda na to, że ten sam problem istnieje również w CE 1.9.2


2

Klienci Magento EE proszeni są o łatkę SUPEE-5874 od zespołu wsparcia Magento Enterprise.

Zaktualizuje dwa pliki

app/code/core/Mage/Cms/Block/Widget/Block.php
app/code/core/Mage/Cms/Block/Block.php

Nie mogę opublikować aktualnej łatki z Magento, ponieważ jest to ich własność.


1

Cieszy nas, że Magento teraz buforuje statyczne bloki. Ponieważ obecna zaktualizowana wersja zawiera ten dziwny problem z powodu buforowania bloków statycznych, możesz używać mojego modułu zupełnie za darmo.

To rozszerzenie jest tworzone w celu lepszego buforowania bloków statycznych. Bierze również pod uwagę, czy strona jest zabezpieczona, czy nie. Ponadto rozszerzenie nie ma żadnych podstawowych poprawek, co czyni ten moduł jeszcze lepszym.

Proszę bardzo .

Aby uzyskać lepszy przegląd rozszerzenia, możesz odnieść się do tego wątku .


0

Udostępniliśmy łatkę dla CE, która rozwiązuje ten problem. Ponieważ EE ma siedzibę w CE, może to również mieć zastosowanie.

Możesz pobrać tę ścieżkę z mojej treści: https://gist.github.com/tux-rampage/77b286f7973336877f7b

Załaduj zawartość, rozpakuj ją i uruchom następującą komendę w swoim katalogu głównym Magento:

patch -p2 </path/to/LUKA-MCE20150714-cms-caching-hotfix.patch

Przetestuj to w środowisku testowym przed zastosowaniem go w systemie na żywo!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.