thinkphp 5.1 接口缓存优化需按场景选驱动:apcu 用于字典类静态数据(须配 prefix 防 key 冲突),redis 用于高频 get 接口(需启持久连接、设 timeout/select),请求缓存仅限无状态路由;禁用全局缓存,避免缓存敏感动态数据。

在 ThinkPHP 5.1 中实现接口缓存优化,核心是**按场景选对缓存驱动、避免无效读写、保证数据一致性**。不推荐全局一刀切启用缓存,而应针对高频、低变、计算开销大的接口做精准缓存控制。
明确哪些接口适合缓存
不是所有接口都该缓存。优先缓存以下类型:
- 用户配置、站点开关、字典类数据(如地区、状态码)——不变或周级更新,适合 APCu
- 列表页、详情页等 GET 接口,参数固定、响应稳定——适合 Redis + 请求缓存或手动 Cache::store()
- 聚合计算结果(如统计总数、排行榜前10)——耗 CPU/DB,缓存 60–300 秒即可显著降压
- 避免缓存含用户身份、权限、实时订单等动态敏感数据;如需缓存,必须带用户 ID 或会话标识作 key 前缀
用好 APCu 缓存低频静态数据
APCu 是单机部署下最轻量的进程内缓存,特别适合拦截 DB 查询中的“字典表”类请求:
- 安装扩展后,务必关闭 CLI 环境的 APCu:
apcu.enable_cli = 0,否则命令行任务读不到缓存,引发逻辑错乱 - 在
config/cache.php的'stores'中单独配置'apcu'驱动,不要改 default,仅按需调用:Cache::store('apcu')->get('area_list') - 显式设置
'prefix' => 'tp5_dict_',防止模块间 key 冲突;例如用户模块和后台都写get('status'),加前缀后实际 key 分别为tp5_dict_user_status和tp5_dict_admin_status
Redis 缓存高频接口并控制连接开销
Redis 用于跨请求、跨进程共享的接口缓存,但默认每次调用 Cache::store('redis') 可能新建连接,高并发下易打爆连接数:
- 启用持久连接:在 Redis store 配置中加
'persistent' => true,同时确认 php.ini 启用redis.pconnect = 1 - 设置超时与库号:
'timeout' => 3防阻塞,'select' => 2指定独立 DB,隔离缓存与 session 数据 - 接口中手动缓存示例:
$key = 'api_user_list_page_' . $page . '_' . $size; $data = Cache::store('redis')->get($key); if ($data === null) { $data = Db::name('user')->paginate($size, false, ['page' => $page]); Cache::store('redis')->set($key, $data, 120); // 缓存 2 分钟 } return json($data);
利用请求缓存简化 GET 接口
对纯展示型 GET 接口(无 POST/PUT、无用户态依赖),TP5.1 支持路由级响应缓存,自动返回 304:
- 全局开启(谨慎):在
app.php中设'request_cache' => true, 'request_cache_expire' => 300 - 更推荐按路由开启:
Route::get('news/list', 'News/list')->cache(600),仅对该 URL 缓存 10 分钟 - 注意:请求缓存基于 URL 完全匹配,含参数(如
/news/list?page=2)会被视为不同缓存项;不支持通配或正则
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











