页面缓存概述
缓存是提高各种Web应用程序性能的最有效方法。一般来说,缓存有两种方式:客户端(浏览器)和服务器端。此外,有两种类型的内容:公共(可供多个客户)和私人(具体到一个客户)。
Magento 2 页面缓存是full-page cache; 也就是缓存整个页面
-
默认缓存机制存储缓存文件有以下方式:
-
在文件系统上.
你不需要做任何事情,使用基于文件的缓存.
- Database
- Redis
-
-
Vanish (推荐)
可缓存和不可缓存的页面
Cacheable(可缓存) 和 uncacheable(不可缓存) 我们使用的术语是指一个页面是否应该全部缓存。(默认情况下,所有的页面都缓存。)
创建一个不可缓存的页面,页面中的块使用 cacheable="false"
标记.
例如 购物车页面,结算页面等等是不可缓存的页面.
Public(公共的)和 私人(private)的内容
Private 页面上的内容仅用于一个用户 ; 例如用户登录的用户名. 在高速缓存页中呈现私有内容有时被称为hole punching ,我们将在下一个主题中更详细地讨论它。
下一篇
Public(公共的)和 私人(private)的缓存内容
Magento 2的页面缓存存储整个缓存页面;页面存储取决于内容是否是私人或公共的。这些术语定义如下:
-
Public, 可以向许多客户展示.
公开的内容存储在缓存存储(文件系统,数据库,或Redis),或Varnish。公共内容包括页眉、页脚和类别列表。
-
Private, 这是不存储在Magento服务器缓存;相反,它是存储在客户端。
私人内容包括收藏、购物车、客户名称、地址。私有内容应限制在页面总内容的一小部分。
指定私人内容
按以下步骤指定私人内容:
- 1.创建一段代码
- 2.创建一个块和模块
- 3.配置一个UI组件
- 4.私有内容生效
下一篇
HTTP context(上下文)
缓存服务器和代理服务器通常使用URL作为缓存标识符;然而,Magento 2的URL是不足区分缓存。(我们可以缓存客户组,选定的语言,客户是否登录,等等)。
为让每个缓存的URL完全独特的,我们用 HTTP上下文变量使Magento2内容基于不同客户群,同一个URL选择的语言,无论用户登录与否,等等。
上下文变量不能针对一个用户,因为变量用于公共内容的缓存密钥中。换句话说,每个用户的上下文变量会导致每个用户在服务器上缓存的内容的单独副本。
Magento2将字符串中的上下文变量,从字符串生成缓存,并设置它的值 X-Magento-Vary
cookie. HTTP代理可以配置为基于cookie和URL计算缓存的唯一标识符。例如,Varnish 4 配置 :
sub vcl_hash {
if (req.http.cookie ~ "X-Magento-Vary=") {
hash_data(regsub(req.http.cookie, "^.?X-Magento-Vary=([^;]+);.*$", "\1"));
}
... more ...
}
有关上下文类的示例,请参见 Magento/Framework/App/Http/Context.
下一篇
缓存失效和私有内容版本
缓存失效
Magento 2实体变化后可以清空缓存,立即查看效果。我们使用 IdentityInterface
将应用程序中的实体与缓存的内容连接起来,并知道当实体改变时要清除哪些缓存。
本节讨论当你改变一个实体时如何告知Magento 2应用清除缓存。
首先,你的实体模块必须实现 Magento/Framework/DataObject/IdentityInterface 如下:
use Magento\Framework\DataObject\IdentityInterface;
class Product implements IdentityInterface
{
/**
* Product cache tag
*/
const CACHE_TAG = 'catalog_product';
/**
* Get identities
*
* @return array
*/
public function getIdentities()
{
return [self::CACHE_TAG . '_' . $this->getId()];
}
}
其次,块对象也必须实现 Magento/Framework/DataObject/IdentityInterface
如下:
class View extends AbstractProduct implements \Magento\Framework\DataObject\IdentityInterface
{
/**
* Return identifiers for produced content
*
* @return array
*/
public function getIdentities()
{
return $this->getProduct()->getIdentities();
}
}
私人内容版本
私有内容存储在浏览器本地存储中,使用private_content_version
cookie存储版本.