Magento 2 Block Cache

Caching plays an essential role in improving the page load time. In this article, I want to show you five blocks cache in Magento 2, or five approaches to caching, and when and how to use them. Interestingly, this article will cover both full page and block cache. Let’s explore each type of block cache together!

Cacheable Block

In case, cache_lifetime of the block is set to a number greater than 0, the block is cacheable (for block cache).

When To Use

You should use the cacheable block in the following situations:

  • The block is frequently used. For example, the same block with the same content is shown on several pages.
  • The block is a cacheable part of the non-cacheable page.

    How To Use

    Take the following actions to use the cacheable block:

  • Setting cache_lifetime via layout XML:
<block class="MyBlock">
    <arguments>
        <argument name="cache_lifetime" xsi:type="number">3600</argument>
    </arguments>
</block>
  • Setting cache_lifetime via DI configuration:
<type name="MyBlock">
    <arguments>
        <argument name="data" xsi:type="array">
            <item name="cache_lifetime" xsi:type="number">3600</item>
        </argument>
    </arguments>
</type>
  • Setting cache_lifetime wondrously in imperative way:
$block->setCacheLifetime(3600);
// or
$block->setData('cache_lifetime');
  • Overriding retriever method (often used in core modules for some reasons):
class MyBlock extends AbstractBlock
{
    protected function getCacheLifetime()
    {
        return 3600;
    }
}

Non-cacheable Block

In case, cache_lifetime of the block is NOT set to a number greater than 0, the block is non-cacheable (for block cache).

Note: By default, all blocks are non-cacheable.

When To Use

You should use the non-cacheable block in the following situations:

  • The block comes with dynamic content and is improbable to be rendered with equal content for several times.
  • The block is used only as a child of a cacheable block in layout hierarchy.

How To Use

Remember to not apply anything from the How to use section of the cacheable block.

Page Cache Killer

In case, the cacheable attribute of a block is set to false in the layout declaration, the block is a page cache killer. If any page cache killer block is displayed on a page, the entire page is not cacheable for Full Page Cache.

When To Use

You should use the page cache killer block in the following situations:

  • The block is rendering private content, but it is not private (view the next type of block)
  • The block is rendering content which should be displayed only once.
  • The block is rendering content which is regularly updated.
  • Business logic implementation includes calls to functions like rank() or mt_rand().

How To Use

To use the Page Cache Killer block, you need to set cacheable attribute of block node in the XML layout to false:

<block class="MyBlock" cacheable="false"/>

Private Block

In case, the _isScopePrivate property of block class is set to true, the block is private. Private blocks are rendered in two stages. There is only a placeholder for the private block in the main response. Separate AJAX request is retrieving actual content and puts it instead of the placeholder.

When To Use

The private block is used when:

  • The block is rendering private (session related) information on a cacheable page.

How To Use

To use the private block, you need to set the protected property of AbstractBlock _isScopePrivate to true

$this->_isScopePrivate = true;

ESI Block

In case, the declaration of the block in the XML layout has ttl attribute, the block is ESI. Only when full page cache application is set to Varnish, ESI blocks are actual. ESI block is fetched by separate Varnish request, cached and invalidated independently from the page.

When To Use

You should use the ESI block in the following situations:

  • The block is considered to be invalidated more frequently than pages where this block is rendered.
  • The block is considered to be invalidated less frequently than pages where this block is rendered.

How To Use

To use the ESI block, you need to insert TTL attribute into block declaration in layout.

<block class="MyBlock" ttl="3600"/>

Conclusion

Above are five block types in the context of caching in Magento 2. I hope that this article is useful for you. If you have any questions, or want to add other types, feel free to leave a comment below.

Enjoyed the tutorial? Spread it to your friends!