实现原理

实现参考『Thikphp 3.2-静态缓存』, 静态缓存只能提供HTML的缓存且只能以文件形式进行缓存。而请求缓存,支持ajax/html的缓存,而且可以根据缓存配置自行切换文件/redis的缓存

缓存检测:

行为app_begin时,检测路由是否需要有缓存,有则返回缓存内容(\Common\Behavior\ReadRequestCacheBehavior)

缓存更新:

行为ajax_return/view_filter时,更换请求的缓存内容(\Common\Behavior\WriteRequestCacheBehavior)

使用指南

1、开启配置app/Application/Common/config.php

  1. // 请求缓存
  2. 'REQUEST_CACHE_ON' => true, // 开启静态缓存
  3. 'REQUEST_CACHE_TIME' => 30*60, // 全局静态缓存有效期(秒)
  4. // 定义静态缓存规则 ['路由规则' => ['expire'=> 10, 'subscribe'=>['路由1','路由2']]],
  5. 'REQUEST_CACHE_RULES' => array(
  6. 'content/index/test' => [
  7. 'expire' => 10000,
  8. 'subscribe' => [ // 依赖test2/test3路由,当test2/test3缓存更新一次后,本路由也需要重新更新缓存
  9. 'Content/Index/test2',
  10. 'Content/Index/test3',
  11. ]
  12. ],
  13. 'Content/Index/test2' => [
  14. 'expire' => 30,
  15. 'subscribe' => []
  16. ],
  17. 'content/index/test3' => [
  18. 'expire' => 30,
  19. 'subscribe' => ['Content/Index/test2']
  20. ],
  21. 'content/index/index' => [], // 最简单配置,默认 全局静态缓存有效期,不依赖其他路由
  22. ),

定义静态缓存规则

  • 路由规则:遵循module/controller/action
  • expire:过期时间
  • subscribe: 依赖配置。当依赖的路由缓存失效或更新后,此路由也需要重新更新缓存

2、Controller 必须继承自 Cms.class.php或其子类

  1. // 正确
  2. class MyController extends Base {}
  3. class MyController extends AdminBase {}
  4. // 错误
  5. class MyController extends Controller {}

最佳实践

  • 开发调试时,不建议开启缓存
  • 把缓存的驱动改为redis,提升响应速度
  • 不建议一个路由同时处理GET/POST,否则缓存会异常,请保持一个路由一种请求方法

启示

保存缓存内容时,我们采用serialize而非json

serialize 优点

  • 体积更小
  • 序列化和反序列化性能更优,如下图

UhjrIf.png

参考链接:https://medium.com/@moinuddinchowdhury/serialize-vs-json-67fe872a7755