“中国要复兴、富强,必须在开源软件领域起到主导作用,为了国家安全和人类发展,责无旁贷,我们须为此而奋斗”——By:云客
在drupal中提供了两个页面缓存模块,一个是PageCache用于匿名访问时,一个是dynamic_page_cache用于处理任意用户的页面缓存,后者进一步运用缓存能力。他们都有对应的请求策略及响应策略。
那么这两种策略如何运作?作用是什么呢?请看下面
先讲讲用于匿名用户的页面缓存PageCache的请求响应策略:
RequestPolicy:请求策略,用于判定评估请求是否允许利用匿名页面缓存,如果允许则从缓存系统中取数据,反之不能从缓存里取数据而是让系统运算生成数据
ResponsePolicy:响应策略,用于评估系统产生的新鲜的可缓存响应是否需要存放到缓存系统里面,在响应本身是可缓存响应的情况下,这给了用户最后一次机会控制是否缓存
以上就是请求、响应策略的目的,下面来看一看它是怎么实现的:
这一块的内容源代码放在\core\lib\Drupal\Core\PageCache里面,可以看到为请求、响应策略分别定义了接口:
RequestPolicyInterface
ResponsePolicyInterface
内容很简单,只有一个 check方法,一个实例就是一条策略,系统往往需要多条策略,因此系统为请求及响应都定义了链式策略,并定义了链式策略接口:
ChainRequestPolicyInterface:链式请求策略,默认实现为ChainRequestPolicy,可以通过addPolicy方法添加多条策略,这些策略共同作用一个结果,规则为:任意一条策略结果为拒绝则拒绝,在没有拒绝的情况下至少一个允许则允许,否则返回NULL
ChainResponsePolicyInterface:链式响应策略,默认实现为ChainResponsePolicy,可以通过addPolicy方法添加多条策略,这些策略共同作用一个结果,规则为:任意一条策略结果为拒绝则拒绝,否则返回NULL
系统默认提供了一些请求、响应策略:
请求策略默认提供了三个:
CommandLineOrUnsafeMethod:当运行于命令行或不安全的http方法(带副作用的,如post)时拒绝
NoSessionOpen:当开启SESSION时拒绝
Drupal\toolbar\PageCache\AllowToolbarPath:它由toolbar模块提供,如果访问的是工具栏页面则允许
响应策略默认提供了5个:
Drupal\node\PageCache\DenyNodePreview:节点预览不缓存
Drupal\image\PageCache\DenyPrivateImageStyleDownload:实体图片预览不缓存
Drupal\Core\PageCache\ResponsePolicy\NoServerError:服务器错误5开头的状态码响应不缓存
Drupal\Core\PageCache\ResponsePolicy\DenyNoCacheRoutes:有no_cache选项设置的请求不缓存
Drupal\Core\PageCache\ResponsePolicy\KillSwitch:当KillSwitch被触发时不缓存
那么用户如何自定义策略呢:
定义一个服务,并给标签为page_cache_request_policy或page_cache_response_policy即可
在容器编译时,系统会自动查找被标记为以上标签的服务并加入到链式策略中
以上就是PageCache模块的策略介绍,关于dynamic_page_cache动态页面缓存后面补充
反馈互动