ryunosuke / simple-cache
简单 PSR-16 缓存
v1.2.1
2024-08-09 12:00 UTC
Requires
- php: >=8.0
- psr/simple-cache: 2.*|3.*
- symfony/var-exporter: 5.*|6.*
Requires (Dev)
- aws/aws-sdk-php: 3.*
- phpunit/phpunit: 9.*
- predis/predis: 2.*
- ryunosuke/functions: 2.0.*
- ryunosuke/phpunit-extension: 4.*
- ryunosuke/stream-wrapper: 1.*
README
描述
这是一个实现了 PSR-16 的简单缓存包。虽然只是流式实现,但 PHP 有强大的 StreamWrapper,所以(如果有 Wrapper)实际上可以向任何对象写入。
安装
{ "require": { "ryunosuke/simple-cache": "dev-master" } }
功能
(如果有 Wrapper)可以在任何地方输出。例如以下是将缓存输出到 S3 的示例。
$s3client = new \Aws\S3\S3Client([
'credentials' => [
'key' => 'foo',
'secret' => 'bar',
],
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
\Aws\S3\StreamWrapper::register($s3client);
$cache = new \ryunosuke\SimpleCache\StreamCache('s3://bucket-name/savedir');
$cache->set('cache-key', 'Hello, world');
var_dump($cache->get('cache-key', 'Hello, world')); // string(12) "Hello, world"
实现了 ArrayAccess。这本身并不是值得注意的实现,但通过 ArrayAccess,可以使用 ??=
实现简单的“如果存在则获取,如果不存在则设置并获取”。
$cache = new \ryunosuke\SimpleCache\StreamCache('s3://bucket-name/savedir');
// あるなら取得、なかったら設定しつつ取得
$cache['cache-key'] ??= heavy_function();
// つまり下記と同義です
if (!$cache->has(['cache-key'])) {
$cache->set('cache-key', heavy_function());
}
此外,还提供了以下方法。
- fetch*: 尝试获取,如果没有则保存闭包的返回值并返回
- *ByHash: 无键约束的缓存
- keys: 获取缓存键的列表
- items: 获取缓存键和缓存项的列表
- gc: 删除过期的项或无效的项
可以通过指定特殊的扩展名来指定存储方式。内置可以使用以下扩展名。
php
: 以 PHP 代码的形式存储。由于 opcache 而速度快php-serialize
: 使用 serialize 存储的。↑存在,所以很少使用
php
可以缓存匿名类或闭包。可以通过 itemClasses
选项扩展这些扩展名和类。
可以通过 defaultExtension
指定没有扩展名时的默认存储方式。
此外,键的 .
表示目录分隔符,会创建新目录。如果不想有这种操作,可以将 directorySupport
明确指定为 false。
许可
MIT
常见问题解答
- 问:为什么重新开发了轮子?
- 答:最初很喜欢使用 symfony-cache,但感觉有些过于复杂,实际上只使用 PhpFilesAdapter,所以想自己实现一个更清晰的结构。
- 问:symfony-cache 不行吗?Redis 或 APCu 等很有用。
- 答:PHP 中已经存在强大的抽象层 StreamWrapper,无需编写专门的 adapter,只需要写
s3://hoge/cache
或redis://hoge/cache
就可以自动判断。
- 答:PHP 中已经存在强大的抽象层 StreamWrapper,无需编写专门的 adapter,只需要写
- 问:那为什么还要自己实现?
- 答:PhpFilesAdapter 输出的文件名并不理想,希望有更简洁、从键可以想到的文件名。
发布
版本采用浪漫版本控制(不是语义版本控制)。
- 主要:在发生重大不兼容性时升级(架构、类结构更改等)
- 次要:在小规模不兼容性时升级(参数更改、类型提示添加等)
- 补丁:没有不兼容性(默认参数添加、新类的添加、代码格式等)
1.2.1
- [feature] 修复 php8.2 的错误
1.2.0
- [*change] 废止 directorySeparator
1.1.1
- [composer] 更新
1.1.0
- [change] php>=8.0
- [change] 完善类型提示
- [*change] memorize 变为 int 限制
1.0.8
- [composer] 更新
1.0.7
- [feature] 添加 All 作为继承所有接口的接口
- [feature] 实现 Hashable
1.0.6
- [feature] 实现 ArrayAccess
1.0.5
- [feature] 添加锁机制
- [fixbug] 修复轻微的不兼容性
1.0.4
- [feature] ChainCache/NullCache 也实现所有接口
- [refactor] 将 fetch 转换为 trait
- [refactor] getMultiple 的实现令人不快,所以进行了重构
1.0.3
- [feature] 实现缓存大小限制
1.0.2
- [feature] 实现 debugInfo
1.0.1
- [feature] 添加 NullCache
- [refactor] 仅返回值也需要类型声明,所以提供了扩展 CacheInterface 的 psr
- [refactor] 引入 SingleTrait 并将其集成到 ChainCache 中
1.0.0
- 发布