ryunosuke/simple-cache

简单 PSR-16 缓存

v1.2.1 2024-08-09 12:00 UTC

This package is auto-updated.

Last update: 2024-09-09 12:07:13 UTC


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/cacheredis://hoge/cache 就可以自动判断。
  • 问:那为什么还要自己实现?
    • 答: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

  • 发布