缓存前缀用于隔离不同环境、模块或业务的缓存数据,防止键名冲突;支持多租户、便于调试清理;可在config/cache.php中设全局字符串前缀,或用匿名函数动态生成,也可手动拼接实现临时指定。

缓存前缀(prefix)主要用来隔离不同环境、模块或业务的缓存数据,避免键名冲突导致互相覆盖。比如用户中心和后台管理都用 cache('list'),没加前缀就会读写同一份缓存,引发数据错乱。
缓存前缀的核心作用
• 防止键名重复:同一缓存驱动下,'user:100' 和 'admin:user:100' 是两个键;但若都不加前缀,都存成 list,后写入的会直接覆盖前一个。
• 支持多租户或多域名场景:可结合 $_SERVER['HTTP_HOST'] 动态生成前缀,让每个域名拥有独立缓存空间。
• 便于调试和清理:加了前缀后,用 php think clear --cache 清理时更可控;Redis 中也能通过 KEYS tp5_user_* 快速定位。
在 config/cache.php 中设置全局前缀
这是最常用也最推荐的方式。打开 config/cache.php,确保返回的是完整配置数组,在对应驱动里填入 'prefix':
如果是 File 驱动:
return [
'type' => 'File',
'path' => '../runtime/cache/',
'prefix' => 'tp5_user_',
'expire' => 3600,
];
如果是 Redis 驱动:
立即学习“PHP免费学习笔记(深入)”;
return [
'type' => 'Redis',
'host' => '127.0.0.1',
'port' => 6379',
'prefix' => 'tp5_api_',
'expire' => 0,
];
注意:prefix 值必须是字符串,不能为 null 或空数组;设为空字符串 '' 等同于不加前缀。
按域名或环境动态设置前缀
适合多站点共用一套代码的情况。把 prefix 设为匿名函数,运行时解析 Host:
'prefix' => function () {
$host = $_SERVER['HTTP_HOST'] ?? 'default';
$host = preg_replace('/:\d+$/', '', $host);
return 'tp5_' . str_replace('.', '_', $host) . '_';
},
这样 site-a.com 的缓存键变成 tp5_site_a_com_list,admin.site-b.com 变成 tp5_admin_site_b_com_list,完全隔离。
模型或查询中临时指定前缀(不常用)
TP5 本身不支持单次查询改缓存前缀,但可通过自定义缓存键实现类似效果:
- 手动拼接前缀:用
Cache::get('user_' . $id)替代Cache::get($id) - 封装工具方法:在基类里写
protected function cacheKey($key) { return config('cache.prefix') . $key; },后续统一调用 - 慎用
Cache::tag():标签机制更适合按业务维度分组清除,不是替代前缀的方案
不复杂但容易忽略



















