Magento2如何设置CMS页面不可缓存 刷新时加载最新数据
问题背景
你在CMS页面中嵌入自定义块的代码如下:{{block class="Test\PointHistory\Block\Index" template="Test_PointHistory::index.phtml"}}
开启全页缓存(Full Page Cache)时,页面刷新始终读取缓存内容,无法实时获取最新数据,以下是可直接落地的解决方案:
解决方案
- 方案1:修改自定义Block类,直接指定块不缓存
在Test\PointHistory\Block\Index类中重写缓存生命周期方法,将缓存有效期设为0,即可让该块每次加载都读取最新数据,代码示例:<?php namespace Test\PointHistory\Block; class Index extends \Magento\Framework\View\Element\Template { /** * 块缓存生命周期,返回0代表不缓存 * @return int|null */ protected function getCacheLifetime() { return 0; } /** * 可选:如果内容和用户登录态、用户分组等私有信息绑定,开启该属性适配私有内容缓存规则 */ protected $_isScopePrivate = true; } - 方案2:通过布局配置控制块缓存规则,无需修改PHP代码
首先修改CMS页内的块嵌入代码,给块增加唯一name标识:{{block class="Test\PointHistory\Block\Index" name="point_history_index" template="Test_PointHistory::index.phtml"}}
之后在对应CMS页面的布局更新XML中,给该块设置缓存有效期为0:<?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="point_history_index"> <action method="setCacheLifetime"> <argument name="lifetime" xsi:type="number">0</argument> </action> </referenceBlock> </body> </page>注意:如果直接给块加
cacheable="false"属性,会导致整个包含该块的页面都跳过全页缓存,整页加载性能会下降,非必要不推荐使用。 - 方案3:Ajax异步加载动态内容(性能最优)
如果希望保留全页缓存的加速效果,同时保证数据实时性,最优方案是让整页依然走FPC缓存,块的位置先输出占位容器,页面加载完成后通过前端异步请求拉取最新的积分数据填充到容器中。该方案不会因为单个动态块影响整页缓存命中率,适合流量较大的站点使用。
注意事项
- 不要随意对包含动态块的页面全局关闭全页缓存,会大幅提升服务器响应压力
- 如果动态内容和用户个体强绑定(比如用户自己的积分历史),优先选择Ajax异步加载方案,避免出现不同用户看到他人数据的缓存错乱问题
内容的提问来源于stack exchange,提问作者PHAM CONG NHAT
相关产品推荐
相关产品推荐

