Magento FPC - Что делает это актуальным?


Смотрите ниже, чтобы переписать этот вопрос.

У сайта Magento EE 1.13.1.0, над которым я работаю, возникли некоторые проблемы с баннерами (на основе виджетов). Баннеры кэшируются при включении FPC, и даже при размещении вызова блока баннеров в некэшированном держателе/контейнере все равно извлекается кэшированный блок баннеров.

Поговорив со службой поддержки Magento, они в основном сказали, что не могут помочь, но я мог бы изучить Сопутствующие товары/распродажи, чтобы увидеть, как они остаются некэшированными.

Я знаю, что блок catalog.product.related и его дочерний блок catalog.product.related.item оба не кэшированы. (Или, скорее, что они существуют в кэше, но обновляются при каждой загрузке страницы, не то чтобы я понимал разницу.) Но, глядя на Enterprise_PageCache_Model_Container_CatalogProductItem Я не могу понять, что в этом такого, что мешает этим блокам кэшироваться бесконечно. Особенно в том, что касается Enterprise_PageCache_Model_Container_Banner, что кажется очень похожим.

Может ли кто-нибудь сказать мне, как я могу заставить баннеры не кэшироваться на все или дайте мне способ напрямую извлекать контент для баннера из базы данных и обходить кэш?

Редактировать:

Проблема, с которой я столкнулся, заключается в следующем: в Magento EE есть баннерная система, привязанная к системе виджетов в CMS. На главной странице рассматриваемого сайта было 4 баннера/виджета, которые были назначены блокам. Затем эти блоки были вызваны в шаблоне домашней страницы следующим образом:

<!-- page.xml -->
<block type="core/text_list" name="home_banner_carousel_one" as="home_banner_carousel_one">
    <label>Homepage Banner Carousel One</label>
</block>
<block type="core/text_list" name="home_banner_carousel_two" as="home_banner_carousel_two">
    <label>Homepage Banner Carousel Two</label>
</block>
<block type="core/text_list" name="home_banner_carousel_three" as="home_banner_carousel_three">
    <label>Homepage Banner Carousel Three</label>
</block>
<block type="core/text_list" name="home_banner_carousel_four" as="home_banner_carousel_four">
    <label>Homepage Banner Carousel Four</label>
</block>

<!-- page/home.phtml -->
<ul class="home-slider">
    <li><?php echo $this->getChildHtml('home_banner_carousel_one', false); ?></li>
    <li><?php echo $this->getChildHtml('home_banner_carousel_two', false); ?></a></li>
    <li><?php echo $this->getChildHtml('home_banner_carousel_three', false); ?></a></li>
    <li><?php echo $this->getChildHtml('home_banner_carousel_four', false); ?></a></li>
</ul>

Проблема заключалась в том, что home.phtml было написано, чтобы скрыть это раздел, если первый блок карусели был пуст. Вот так:

$carouselOne = $this->getChildHtml('home_banner_carousel_one', false);
if (empty($carouselOne)) {
    echo 'Nothing here';
} else {
    echo $carouselOne;
}

Это было написано без учета полного кэша страниц в Magento. Когда этот кэш был включен, эта логика внезапно нарушилась.

Мое решение состояло в том, чтобы переместить эту логику в свой собственный блок, а затем попытаться раскрыть этот блок "обертки" и все блоки карусели внутри.

Простое добавление <action method="setCacheLifetime" /> в определение блока в page.xml не оказало никакого влияния на кэш полной страницы предприятия.

Author: Tyler V., 2014-04-24

1 answers

Лучший способ определить кэширование блоков - использовать модуль aoe_templatehints и просмотреть соответствующие блоки, так как он предоставит вам подробную информацию о кэшировании всех ваших блоков.

3 Основные причины, приводящие к аннулированию кэширования: cache_key, cache_lifetime и cache_tags.

cache_tags предназначен для группировки блоков, чтобы помочь сделать недействительным другое содержимое, которое может содержать признанный недействительным блок, чтобы его можно было восстановить.

cache_lifetime Я думаю, что это самость пояснительный. Он не будет функционировать должным образом, если ни один тег, ключ или контейнер не были установлены должным образом.

Чтобы ответить на ваш вопрос, cache_key - это то, что проверяется, чтобы определить, изменились ли в нем какие-либо данные, чтобы восстановить его содержимое и сделать его недействительным. Обычно это md5 хэшируется, поэтому легко обнаружить любые изменения содержимого.

Пример класса блоков:

public function _construct(){
    parent::_construct();
    $this->addData(array(
        'cache_lifetime' => 999999999,
        'cache_tags' => array(Mage_Catalog_Model_Product::CACHE_TAG, Mage_Catalog_Model_Category::CACHE_TAG),
        'cache_key' => md5($this->_data);
    ));

}

Ваш класс контейнера может выглядеть примерно так, чтобы полностью избежать кэширования, если вы предпочитаю:

class Namespace_Module_Model_Pagecache_Container
    extends Enterprise_PageCache_Model_Container_Abstract
{
    /**
     * Get container individual cache id
     *
     * Override to return false to cause the block to never get cached
     *
     * @return string
     */
    protected function _getCacheId()
    {
        return false;
    }

    /**
     * Render block content
     *
     * @return string
     */
    protected function _renderBlock()
    {
        $block = $this->_placeholder->getAttribute('block');
        $block = new $block;

        // only needed if the block uses a template
        $block->setTemplate($this->_placeholder->getAttribute('template'));

        return $block->toHtml();
    }

    /**
     * Generate placeholder content before application was initialized and
     * apply to page content if possible
     *
     * Override to enforce calling {@see _renderBlock()}
     *
     * @param string &$content The content
     *
     * @return bool
     */
    public function applyWithoutApp(&$content)
    {
        return false;
    }
}

Вы также можете прочитать ответ Винаи о 4 состояниях FPC, чтобы помочь понять, что означает каждое из них и как это может быть связано с вашей проблемой блоков

Ссылки и дополнительные чтение:

Также вот хорошая блок-схема рабочего процесса FPC, которую я нашел в раю для разработчиков сдвиньте немного назад, что, я думаю, поможет наглядно проиллюстрировать, как работает FPC.

Magento FPC flowchart

 2
Author: B00MER, 2015-11-09 00:04:01