全局请求缓存仅对GET请求生效,需同时配置request_cache和request_cache_expire,URL含参变化即失效;路由级cache()方法更安全可控,支持变量替换、标签清理及动态设置,避免陈旧数据与并发问题。

请求缓存不是“开了就能加速”,它只对 GET 请求生效,且默认缓存标识是完整 URL(含参数),URL 一变就失效。盲目开启全局缓存反而可能让页面显示陈旧数据,尤其在有用户态、分页、搜索等动态场景下。
全局请求缓存怎么配才安全
全局请求缓存由两个配置项控制:request_cache 和 request_cache_expire,必须同时设置才生效。
-
request_cache设为true表示启用,设为字符串(如'__URL__')则指定缓存标识生成规则 -
request_cache_expire是秒数,比如600表示 10 分钟;设为0不代表永不过期,而是由底层缓存驱动决定(File 驱动下实际是永久) - 只对
GET请求起作用,POST/PUT/DELETE完全忽略 - 如果路由中显式调用了
cache()方法,该路由的缓存设置会覆盖全局配置
路由级缓存:精准控制每个接口的缓存行为
比全局配置更常用也更可控的方式,是在定义路由时直接设置缓存策略。
- 基础用法:
Route::get('news/:id', 'News/read')->cache(3600),缓存 1 小时,标识为当前 pathinfo(如/news/123) - 带变量的标识:
cache(['news/:id/:page', 3600]),:id和:page会被替换成实际请求参数值,避免不同分页互相污染 - 加缓存标签便于清理:
cache(['news/:id', 3600, 'news']),后续可用Cache::tag('news')->clear()批量清除 - 想关闭某条路由的缓存?传
false:->cache(false),哪怕全局开启了也会被禁用
动态设置请求缓存:适合中间件或公共逻辑
有些缓存逻辑没法写死在路由里,比如根据用户登录态、设备类型或请求头动态决定是否缓存,这时要用 Request::cache()。
立即学习“PHP免费学习笔记(深入)”;
-
Request::cache('user/:uid', 600)—— 按用户 ID 缓存,需确保:uid在param()中存在 -
Request::cache('__URL__', 300)—— 用完整 URL 做标识,注意域名、协议、参数顺序都影响命中 -
Request::cache('[html]', 600)—— 对所有.html后缀的 GET 请求统一缓存 10 分钟 - 该方法必须在控制器执行前调用(例如在
app\common.php或中间件中),否则响应已开始输出,缓存无效
容易踩的坑和关键细节
请求缓存本质是「HTTP 缓存 + 响应体缓存」双层机制,浏览器收到 304 状态码时不会触发 PHP 执行,但很多人没意识到这点带来的副作用。
- 时间类、随机数、用户昵称等动态内容一旦被缓存,后续访问全显示第一次的结果,必须排除或用独立缓存方式处理
- 缓存标识若含未定义变量(如写了
:page但请求没传page参数),会导致标识为空或报错,建议配合param()校验 - 使用
File缓存驱动时,并发写入可能引发文件锁问题,高并发建议切redis驱动 -
request_cache和cache.php中的type是两套系统:前者管 HTTP 层响应缓存,后者管数据/模板等业务缓存,别混为一谈
真正难的不是配开关,而是判断哪些请求值得缓存、缓存多久、缓存粒度怎么划——URL 越细越安全,越粗越容易出错。上线前务必用 curl 测 ETag 和 Last-Modified 头,确认缓存行为符合预期。



















