fiberphp / cache
FiberPHP cache manager: PSR-16 multi-driver (redis/file/memory) with tag grouping.
dev-master
2026-08-22 08:10 UTC
Requires
- php: >=8.3
- fiberphp/framework: dev-master
- fiberphp/redis: dev-master
- psr/simple-cache: ^3.0
Requires (Dev)
- phpunit/phpunit: ^11.0
This package is not auto-updated.
Last update: 2026-08-22 11:17:30 UTC
README
FiberPHP 框架的缓存子包。提供 PSR-16 SimpleCache 实现,支持 redis / file / memory 三种驱动,内置标签(tag)分组、自增自减、pull / push 等扩展方法,通过 config/cache.php 声明式管理多 store。
特性
- PSR-16:实现
Psr\SimpleCache\CacheInterface,可直接对接 PSR-16 消费方 - 多驱动:redis(基于
fiberphp/redisSync)、file(本地落盘)、memory(进程内数组,测试用) - 多 store:通过
config/cache.php的 stores 声明多个独立 store,惰性构建、内存复用 - 标签分组:
tag()链式设置标签上下文,tag()->clear()按标签批量清除 - 扩展方法:increment / decrement / pull / push / handler
- 模板方法:
AbstractDriver统一序列化/前缀/标签,子类实现do*模板方法
环境要求
- PHP >= 8.3
fiberphp/frameworkdev-masterfiberphp/redisdev-master(redis 驱动)
安装
composer require fiberphp/cache
安装后 PackageInstaller::discover 自动把 config/cache.php 拷贝到应用 config/cache.php(幂等不覆盖),并通过 PackageManifest 注册 CacheProvider。
配置
config/cache.php:
return [
// 默认 store
'default' => 'default',
// 缓存 store 配置(支持 driver: redis|file|memory)
'stores' => [
'default' => [
'driver' => 'redis',
'connection' => 'default', // 对应 config/redis.php 中的连接名
'prefix' => 'cache:',
'expire' => 0, // 默认有效期秒数(0 = 永久)
'tag_expire' => 86400 * 30, // tag 键过期秒数
'tag_prefix' => 'tag:',
],
// 按需声明更多 store
// 'file' => ['driver' => 'file', 'path' => runtime_path('cache'), ...],
],
];
| 字段 | redis | file | memory | 说明 |
|---|---|---|---|---|
driver | ✓ | ✓ | ✓ | 驱动类型 redis|file|memory |
connection | ✓ | — | — | redis 连接名(对应 config/redis.php) |
path | — | ✓ | — | file 落盘目录(默认 runtime/cache) |
prefix | ✓ | ✓ | ✓ | 缓存键前缀 |
expire | ✓ | ✓ | ✓ | 默认有效期秒数(0 = 永久) |
tag_expire | ✓ | ✓ | ✓ | tag 键过期秒数 |
tag_prefix | ✓ | ✓ | ✓ | tag 键前缀 |
使用
基础读写(PSR-16)
cache()->set('foo', 'bar');
cache()->get('foo'); // 'bar'
cache()->get('missing', 'def'); // 'def'
cache()->has('foo'); // true
cache()->delete('foo');
cache()->setMultiple(['a' => 1, 'b' => 2]);
cache()->getMultiple(['a', 'b']); // ['a' => 1, 'b' => 2]
cache()->deleteMultiple(['a', 'b']);
cache()->clear();
多 store
cache()->store('default')->set('k', 'v'); // 显式指定 store
cache()->store('file')->get('k'); // 文件 store(需在 config 声明)
cache()->get('k'); // 走 default store(__call 转发)
标签分组
cache()->tag('users')->set('u:1', 'alice');
cache()->tag('users')->set('u:2', 'bob');
cache()->set('other', 'val');
cache()->tag('users')->clear(); // 只清 users 标签下的键
cache()->get('other'); // 'val'(不受影响)
自增自减
cache()->increment('counter'); // 1
cache()->increment('counter', 2); // 3
cache()->decrement('counter'); // 2
pull / push
cache()->set('once', 'data');
cache()->pull('once'); // 'data'(读取后立即删除)
cache()->push('list', 'a');
cache()->push('list', 'b');
cache()->push('list', 'a'); // 去重
cache()->get('list'); // ['a', 'b']
获取原生驱动
$driver = cache()->store()->handler(); // DriverInterface
$redis = cache()->driver(); // 默认 store 的 Redis 驱动(仅 redis 驱动)
$sync = $redis->connection(); // FiberPHP\Redis\Sync
驱动
| 驱动 | 底层 | 持久化 | 标签实现 | 适用 |
|---|---|---|---|---|
| redis | fiberphp/redis Sync | ✓ | 原生 sAdd/sMembers(原子) | 生产 / 高并发 |
| file | 本地文件 | ✓ | read-modify-write | 本地开发 |
| memory | 进程内数组 | ✗ | read-modify-write | 单元测试 |
启动探活
CacheProvider 在 Worker 启动时访问探针 key 预建立 Redis 连接:
- 非关键探活:失败仅记录警告,不中断启动(Redis 可用性已由
RedisProvidercritical 探活保障) - 日志通道:声明
config('log.cache')时写入cache通道,否则写入默认通道
License
MIT