decodelabs / stash
PSR6 / PSR16 缓存处理器
v0.5.8
2024-08-22 01:39 UTC
Requires
- php: ^8.1
- decodelabs/archetype: ^0.3
- decodelabs/atlas: ^0.12
- decodelabs/coercion: ^0.2.6
- decodelabs/dictum: ^0.6.0
- decodelabs/exceptional: ^0.4.3
- decodelabs/glitch-support: ^0.4
- decodelabs/veneer: ^0.11.6
- nesbot/carbon: ^2|^3
- psr/cache: ^3.0
- psr/simple-cache: ^3.0
Requires (Dev)
- ext-apcu: ^5.1
- ext-memcached: ^3.2
- ext-redis: ^5.3|^6
- decodelabs/dovetail: ^0.2
- decodelabs/genesis: ^0.9
- decodelabs/phpstan-decodelabs: ^0.6
- predis/predis: ^2.0
Suggests
- ext-apcu: For APCu support
- ext-memcached: For memcached support
- ext-redis: For redis support
- decodelabs/dovetail: For dovetail config integration
- predis/predis: For redis support
Provides
README
缓存存储系统
Stash 为 PHP 提供了一个 PSR6 / PSR16 兼容的缓存系统。
在 DecodeLabs 博客 上获取新闻和更新。
安装
composer require decodelabs/stash
使用
通过 PSR6 或 PSR16 接口机制在标准化的临时缓存中存储和访问数据。缓存被命名空间化,以允许在用途域之间清晰分离数据。
use DecodeLabs\Stash; $myCache = Stash::load('MyCache'); if(!$cache->has('myValue')) { $cache->set('myValue', [1, 2, 3]); } $total = 0; foreach($cache->get('myValue', []) as $number) { $total += $number; } $cache->delete('myValue');
获取
使用获取方法确保在一次调用中缓存值已就绪
$myValue = $myCache->fetch('myValue', function() { return [1, 2, 3]; // Only called if key not found in cache });
数组访问
数组访问方法提供了快速偏移访问缓存数据
if(!isset($myCache['myValue'])) { $myCache['myValue'] = 'Hello world'; } echo $myCache['myValue']; unset($MyCache['myValue']);
对象访问
对象访问与 ArrayAccess 的工作方式相同,但返回值为 PSR6 缓存项对象
$item = $myCache->myValue; if(!$item->isHit()) { $item->set('Hello world'); } echo $item->get(); $item->delete();
驱动器
以下驱动器是默认提供的
- Memcache
- Redis
- Predis(本机 PHP Redis 客户端)
- APCu
- 文件(序列化数据)
- PhpFile(var_export 数据)
- PhpArray(内存中)
- 黑洞(不存储任何内容)
然而,Stash 使用 Archetype 来加载驱动类,因此可以通过实现自己的 Resolver
来提供额外的驱动器。
默认情况下,Stash 将使用最适合您环境的驱动器,从 Memcache 开始,通过 Redis 和 APCu,最后回退到文件存储。
配置
所有驱动器都有默认配置,允许它们开箱即用,但 Stash 提供了实现自己的配置加载器的功能,这样您就可以在每个命名空间的基础上控制驱动器和设置。
按照您的系统要求实现以下接口;所有可空方法都可以直接返回 null 以使用默认配置
interface Config { public function getDriverFor(string $namespace): ?string; public function isDriverEnabled(string $driver): bool; public function getAllDrivers(): array; public function getDriverSettings(string $driver): ?array; public function getPileUpPolicy(string $namespace): ?PileUpPolicy; public function getPreemptTime(string $namespace): ?int; public function getSleepTime(string $namespace): ?int; public function getSleepAttempts(string $namespace): ?int; }
然后让 Stash 了解您的配置提供者
Stash::setConfig(new MyConfig());
自定义存储方法
默认情况下,新加载的缓存使用通用的存储实现,但如果您需要针对领域定向的数据访问自定义方法,您可以使用自定义的 Archetype Resolver
来实现自己的存储类。
namespace MyApp; use DecodeLabs\Archetype; use DecodeLabs\Stash\Store; use DecodeLabs\Stash\Store\Generic; class MyCache extends Generic { public function getMyData(): string { return $this->fetch('myData', function() { return 'Hello world'; }); } } Archetype::map(Store::class, namespace::class); $myCache = Stash::load('MyCache'); // Will now use MyApp\MyCache
许可
Stash 在 MIT 许可证下授权。有关完整的许可证文本,请参阅 LICENSE。