thinkphp请求缓存可通过路由设置、动态设置和自动缓存三种方式启用:路由中用cache()方法指定缓存时间与标识;动态调用request::cache()支持变量替换和标签;全局配置request_cache为true并设expire值可自动缓存get请求。

如果您在ThinkPHP应用中发现重复的GET请求仍频繁执行控制器逻辑、响应时间未下降,可能是Request缓存未正确开启或存在安全配置疏漏。以下是开启Request缓存并确保其安全可用的具体操作步骤:
一、启用全局Request缓存并设置基础参数
全局Request缓存通过配置项控制是否对所有匹配的GET请求自动生成响应快照,并依据URL(MD5哈希)作为缓存标识。该机制依赖HTTP缓存头与服务端响应内容双重存储,仅对无副作用的只读请求有效。
1、打开项目根目录下的config/app.php文件。
2、在配置数组中添加或修改以下两项:
'request_cache' => true,
'request_cache_expire' => 3600,
3、保存文件后,首次访问任意GET接口时将生成缓存文件,路径为runtime/cache/下以URL MD5值命名的PHP序列化文件。
二、配置请求缓存排除规则防止敏感路径被缓存
某些路由(如用户中心、订单提交、后台管理)若被意外缓存,将导致不同用户看到他人数据或表单重复提交,必须显式排除。排除规则基于请求路径前缀匹配,不支持通配符或正则,且不解析查询参数。
1、在config/app.php的配置数组中追加'request_cache_except'项。
2、填入需禁用缓存的完整路径前缀,例如:
'request_cache_except' => ['/admin/', '/user/login', '/api/order/submit'],
3、确认所列路径与实际路由定义中的pathinfo起始部分完全一致,如https://example.com/admin/dashboard会被排除,而https://example.com/index/admin不会被排除。
三、通过路由定义单独启用高精度缓存并绑定变量标识
当全局缓存粒度不足(如需区分不同ID或分页)时,应在路由层指定缓存标识,使:id、:page等变量参与缓存键生成,避免不同资源相互覆盖。此方式优先级高于全局配置,且可独立关闭某条路由缓存。
1、打开路由定义文件(如route/route.php)。
2、使用Route::get()定义目标路由,并在第三个参数中传入cache选项:
Route::get('article/:id', 'index/Article/read', ['cache' => ['article/:id', 7200]]);
3、验证缓存生效:访问/article/123后再次刷新,响应内容与时间戳应保持不变;访问/article/456则生成独立缓存,互不影响。
四、在控制器中动态控制请求缓存生命周期
对于需要运行时决策是否缓存、或根据用户状态/权限动态调整缓存策略的场景,可在app_begin行为或控制器方法内调用Request::instance()->cache()进行强制设定,覆盖配置层默认行为。
1、在app/common.php中注册app_begin行为,或直接在控制器方法开头插入代码。
2、调用缓存设置方法,例如:
Request::instance()->cache('user/profile', 1800, 'user');
3、其中第三个参数'user'为缓存标签,可用于后续批量清除(如用户登出时调用Cache::tag('user')->clear())。
五、验证Request缓存是否生效及安全边界
缓存生效需同时满足:请求为GET方法、无Cookie或Header中无Cache-Control: no-cache、响应状态码为200、未命中request_cache_except列表。安全验证重点在于确认敏感响应头(如Set-Cookie、Vary)未被缓存污染。
1、使用浏览器开发者工具打开Network面板,访问已配置缓存的URL。
2、检查响应头中是否包含X-ThinkingPHP-Cache: hit或X-ThinkingPHP-Cache: miss字段。
3、确认响应头中不含Set-Cookie、WWW-Authenticate、Authorization等禁止缓存的敏感头字段。
4、手动在请求中添加Cache-Control: no-cache Header,验证是否跳过缓存并返回实时响应。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











