decodelabs/stash

PSR6 / PSR16 缓存处理器

v0.5.8 2024-08-22 01:39 UTC

README

PHP from Packagist Latest Version Total Downloads GitHub Workflow Status PHPStan License

缓存存储系统

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