ThinkPHP5请求缓存怎么开_ThinkPHP5请求缓存提升性能【性能】
ThinkPHP5请求缓存仅对GET请求生效,缓存键默认为URL的MD5值。全局开启需在config/app.php中设置request_cache为true且request_cache_expire为整数,同时通过request_cache_except排除敏感路径防数据串流。路由层支持指定缓存标识与生命周期,控制器内可动态调用request::cache
ThinkPHP5 的请求缓存功能,很多开发者一开始都会被它的配置细节绊住。说简单也简单,说坑也不少——最典型的情况是,配置一加,页面确实快了,可 POST 请求也被缓存了,或者登录用户看到的数据串到了别人头上。问题出在哪?核心就一句话:请求缓存只对 GET 生效,缓存键默认是 URL 的 MD5 值。如果这两条没吃透,后面所有的调优都是空中楼阁。

直接开就行,但必须确认只对 GET 请求生效,且缓存键默认是 URL 的 MD5 值 —— 如果你看到 POST 请求被缓存、或带登录态的页面被共享,说明配置已出错。
全局开启 request_cache 并设有效期
这是最常用也最容易误配的一环。ThinkPHP5 的请求缓存不是「开关一按就全速跑」,它依赖两个硬性配置同时存在才激活:
request_cache必须为true,不能是字符串"true"或整数1request_cache_expire必须是整数(单位:秒),比如3600,不能写成"3600"或留空- 这两项都要加在
config/app.php的主配置数组里,不是cache子数组下 - 开启后,只有纯 GET 请求会被缓存;HEAD、OPTIONS 等方法不参与,POST/PUT/DELETE 一律跳过
示例正确写法:
return [
// ...其他配置
'request_cache' => true,
'request_cache_expire' => 3600,
];
改完配置没效果?去 runtime/cache/ 目录下看一眼有没有生成以 URL MD5 命名的 PHP 文件 —— 没有就说明配置未加载或请求不是 GET。
排除敏感路径,避免用户数据串流
request_cache_except 不是可选功能,而是安全底线。它用的是前缀匹配,不解析查询参数,也不支持正则,所以写法必须严格对应路由 pathinfo 起始部分。
- 比如要屏蔽
/admin/dashboard,就得写'/admin/',不能写'admin'或'/admin'(少斜杠) - 如果路由定义是
Route::get('user/profile', ...),那排除项应为'/user/profile',不是'/user/'(太宽泛) - 多个路径用数组,不要用逗号分隔字符串
- 注意:该配置仅影响全局缓存,不影响路由层单独设置的
cache参数
常见踩坑:后台接口被缓存,导致 A 用户登出后 B 用户刷新看到 A 的订单列表 —— 这就是没加 '/admin/' 或 '/user/' 导致的。
路由层精细控制缓存标识与生命周期
全局缓存用 URL 全量做 key,一旦带分页、ID、筛选参数就容易冲突或失效。这时必须在路由定义里手动指定缓存标识,让变量参与 key 生成。
- 写法:
Route::get('article/:id', 'index/Article/read', ['cache' => ['article/:id', 7200]]) - 其中
:id会被真实值替换,article/123和article/456生成完全独立的缓存文件 - 如果想再细分,比如按分页缓存:
['article/:id/:page', 3600],:page同样会被替换 - 这个配置优先级高于全局
request_cache,哪怕全局关了,这条路由仍会缓存 - 想临时禁用某条路由缓存?把
cache设为false即可
性能提示:标识中尽量只含稳定变量(如 :id),避免用 :keyword 这类高频变动参数,否则缓存命中率极低。
控制器里动态调用 request::cache() 的适用场景
不是所有缓存策略都能提前写死在路由里。比如首页是否缓存,要根据用户是否登录、是否是 VIP、甚至当前时间是否在活动期内来决定 —— 这时就得在控制器里运行时判断。
- 调用方式:
$this->request->cache('/home/index', 1800),第一个参数是缓存标识(建议带前缀),第二个是秒数 - 必须在响应输出前调用,且只能在 action 方法开头附近使用,晚于数据库查询或模板渲染就无效
- 注意:该方法不会覆盖全局配置,但会覆盖当前请求的缓存行为 —— 即使全局开了,这里设了
false就不缓存 - 不推荐在中间件里调用,因为请求缓存机制在路由调度完成后才介入,中间件阶段调用无意义
最易忽略的一点:缓存标识若不含业务上下文(比如固定写 '/home/index'),多个用户访问时会共用同一份缓存内容 —— 动态标识必须包含用户身份特征,例如 'home_index_' . $uid,否则就变成公开“缓存污染”。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















