ThinkPHP 6.x 自定义缓存驱动必须继承 think\Cache 并实现 get、set、delete、clear、has 五个抽象方法;需在 config/cache.php 中注册完整命名空间类名;构造函数不直连资源,采用懒加载 init();推荐显式调用 Cache::store('name')。
缓存驱动类必须继承
并实现抽象方法
ThinkPHP 6.x 的缓存驱动扩展不是简单写个类就能用,核心前提是:你的自定义驱动类必须继承
,且完整实现
、
、
、
、
这 5 个抽象方法。漏掉任意一个,运行时会直接报
。
常见错误是只重写
和
,以为其他方法可以忽略——实际不行。哪怕
只是遍历删除,也得显式写出逻辑。
:注意返回值类型需与默认值一致,避免在严格模式下触发类型警告
:$ttl 可能为
(永不过期)或整数秒,别直接当成时间戳处理
:返回布尔值,失败不能静默,必须 return false
驱动注册必须在
中声明并配置
写完驱动类后,不注册等于没写。ThinkPHP 不会自动扫描驱动,必须手动在
的
数组里加一项:
关键点:
立即学习
“
PHP免费学习笔记(深入)
”;
值必须是**完整命名空间类名**(字符串),不是别名或短名
类名必须可被自动加载,建议放在
下并确保
的 autoload 已包含该路径
配置项(如
、
)会作为构造参数传入驱动类的
,所以你的构造函数签名要匹配:
构造函数中不要直接连接资源,延迟到首次调用时初始化
很多自定义驱动在
里就 new Redis() 或 connect MySQL,结果导致每次请求都建立连接,即使没用到缓存。这不仅浪费资源,还可能在 CLI 命令中意外触发连接失败异常。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
正确做法是把连接逻辑放到
方法里,并在每个缓存操作方法(如
)开头检查是否已初始化:
然后在
开头加
。这样既保证懒加载,又避免重复连接。
使用
显式指定驱动,而非依赖默认配置
即使你把自定义驱动设为默认(
),也建议在业务代码中显式调用:
。原因有二:
避免因 config/cache.
php
被其他模块修改导致行为漂移
方便单元测试 mock 特定 store,比如用
隔离验证逻辑
如果驱动内部用了非标准序列化(如 msgpack),混用不同 store 容易出现
另外,
在自定义驱动中默认不支持,若需标签功能,必须额外实现
方法并维护 tag-key 映射关系——这点很容易被忽略,直到上线后发现
完全无效。
think\Cachethink\CachegetsetdeleteclearhasTypeError: Cannot instantiate abstract classsetgetclearget($key, $default = null)set($key, $value, $ttl = null)nulldelete($key)config/cache.phptypeconfig/cache.phpstores
'myredis' => [
'type' => \app\cache\MyRedisCache::class,
'host' => '127.0.0.1',
'port' => 6379,
],
typeapp/cache/composer.jsonhostport__construct()public function __construct(array $config = [])__constructinit()get
private $client;
private $inited = false;
protected function init()
{
if ($this->inited) return;
$this->client = new \Redis();
$this->client->connect($this->config['host'], $this->config['port']);
$this->inited = true;
}
get()$this->init();Cache::store('myredis')'default' => 'myredis'Cache::store('myredis')->get('key')Cache::store('test')->set(...)unserialize(): Error at offsetCache::tag()tag()Cache::tag('user')->set()