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
не оказало никакого влияния на кэш полной страницы предприятия.
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, чтобы помочь понять, что означает каждое из них и как это может быть связано с вашей проблемой блоков
Ссылки и дополнительные чтение:
- https://stackoverflow.com/questions/9120413/how-do-i-include-a-dynamic-block-in-the-product-page-with-full-page-caching-turn/9125519#9125519
- https://stackoverflow.com/questions/16485355/difference-between-cache-key-and-cache-tags
- http://magebase.com/magento-tutorials/adding-cache-support-to-magento-blocks/
Также вот хорошая блок-схема рабочего процесса FPC, которую я нашел в раю для разработчиков сдвиньте немного назад, что, я думаю, поможет наглядно проиллюстрировать, как работает FPC.