云客Drupal8源码分析之缓存上下文CacheContext

本文详细解析Drupal8中的缓存上下文CacheContext,介绍了上下文的概念及其在软件工程中的重要性,特别是在Drupal中如何定义和使用缓存上下文。缓存上下文决定了缓存ID,用于区分不同环境下的数据变体。文章还探讨了缓存上下文的实现、自定义方法、优化策略,以及与缓存标签的区别,并提供了官方文档链接。
摘要由CSDN通过智能技术生成

“上下文Context”这个词是什么意思呢?平常生活中它常见于语言、文字交流里面,意思是当前交流处于一个特定的环境下,依托前面的内容交流才有意义

比如这句话:“他正在学习drupal”,如果单独说是没有意义的,因为你不知道“他”指代谁,在交流中前面一定定义清楚了“他”是谁,这个“他”就是上下文,这个谁就是上下文的值

在软件工程中,上下文是一种属性的有序序列,它们为驻留在环境内的对象定义环境。不过你无需去理会这样晦涩的定义,只需要知道“上下文”相当于“环境”就行了,它们是等价的。

假设将来能制造出真正的类人智能机器人,那么把它投放到社会中,激活那一刻,他第一件事情就是侦查环境,换句话说就是搞清楚自己所在的上下文,然后他才能有所行动

可见上下文概念是如此重要,在脑子里面建立一个印象:有目的的行为是建立在环境之上的,万事万物皆是如此

 

在drupal中上下文就是指当请求到来时,系统所处的工作环境,这个环境由请求和系统设置共同构成,系统首先要搞清楚环境(上下文)才知道自己该怎么行动(正应前文所讲)。

那么缓存上下文CacheContext呢,就是指相对于缓存系统的环境(缓存环境是系统环境的子集),缓存系统依据此环境才能正确行动,具体实现就是缓存依据这个上下文来存放或取回正确的数据。

在缓存系统中,相对于缓存标签代表缓存有效性而言,缓存上下文代表数据的变体,同一份数据不同环境有不同变体,可以说缓存上下文主要目的就是产生缓存id

缓存上下文决定了缓存id,也就是Cid,它唯一标识一条缓存,用它取回和设置一条缓存,关于缓存系统的介绍请看本系列前面的主题

 

下面我们来看一看缓存上下文怎么使用,以及系统是如何实现的:

 

缓存上下文的用法:

缓存上下文的值是一个字符串数组,字符串是特定的,代表一种上下文,这个上下文用一个上下文对象实现,以容器的服务形式存在,加上“cache_context.”前缀就是它对应的容器服务id

这个字符串经常被叫做“token”、上下文id、缓存上下文占位符等

本质上讲它是某一环境参数的标识符,在计算Cid(缓存id)时将通过对应的上下文服务对象得到具体的环境值

一个简单的例子,比如在控制器返回的渲染数组可以这样指定缓存属性:

$build = [
  '#markup' => t('Hi, %name, welcome back!', ['%name' => $current_user->getUsername()]),
  '#cache' => [
    'keys' => [...],
    'contexts' => ['user'],
    'tags' => [...],
    'max-age' => -1
     ]
];

这里的'user'就是缓存上下文id,可以有多个上下文id,它们组成一个上下文数组,系统默认提供了以下上下文id:

Array
 (
     [0] => cookies
     [1] => headers
     [2] => ip
     [3] => languages
     [4] => request_format
     [5] => route
     [6] &#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值