ThinkPHP 5.1中APCu缓存需独立配置、按需调用、显式读写——在config/cache.php的stores中新增apcu驱动,设prefix防冲突、expire控制过期;代码中用Cache::store('apcu')读写,不可用cache()助手函数;配合Redis可实现双级缓存,但更新时必须同步清理两级。

ThinkPHP 5(特指 5.1)中使用 APCu 缓存,核心是**按需调用、独立配置、显式读写**——它不替代默认缓存驱动,而是作为轻量级本地缓存,专用于字典、配置等低频变更数据。
安装并启用 APCu 扩展
先确保 PHP 环境已加载 APCu:
- Ubuntu/Debian:运行
sudo apt install php-apcu;CentOS:运行sudo yum install php-apcu - 重启 PHP-FPM:
sudo systemctl restart php-fpm - 验证是否生效:
php -m | grep apcu,有输出即成功 -
关键一步:编辑
php.ini,添加或确认apcu.enable_cli = 0,避免命令行任务与 Web 请求缓存行为不一致
在 config/cache.php 中单独配置 APCu 驱动
不要改 default,只在 'stores' 数组里新增一项:
'apcu' => [
'type' => 'apcu',
'prefix' => 'tp5_dict_', // 必须设前缀,防模块间 key 冲突
'expire' => 3600, // 单位秒,0 表示永不过期(适合静态配置)
],
这样配置后,APCu 就可被按需调用,不影响其他缓存逻辑(如模型查询缓存、模板缓存等)。
立即学习“PHP免费学习笔记(深入)”;
代码中显式调用 APCu 缓存
直接使用 Cache::store('apcu') 进行读写,例如获取地区列表:
$list = Cache::store('apcu')->get('area_list');
if ($list === null) {
$list = Db::name('area')->select();
Cache::store('apcu')->set('area_list', $list, 3600);
}
注意:
- 不要用 cache('key') 助手函数,它不支持指定 store,无法命中 APCu
- Cache::get() 返回 null 表示未命中,不是失败,需主动判断
- 建议所有 key 都带业务标识,比如 'user_status'、'admin_menu',避免跨模块覆盖
配合 Redis 做双级缓存(可选进阶)
若同时用了 Redis,可设计“先查 APCu,未命中再查 Redis”逻辑:
$key = 'config:site';
$data = Cache::store('apcu')->get($key);
if ($data === null) {
$data = Cache::store('redis')->get($key);
if ($data !== null) {
Cache::store('apcu')->set($key, $data, 0); // APCu 中设永不过期
}
}
更新数据时,必须两级都删:Cache::store('apcu')->delete($key);Cache::store('redis')->delete($key);
TP 不自动同步,漏删一级就会导致脏数据。



















