beryllium/cache

提供对众多缓存实现的PHP接口

2.0.0 2019-09-15 06:38 UTC

This package is auto-updated.

Last update: 2024-08-29 03:29:18 UTC


README

此库实现了PSR-16 "Simple Cache",并添加了一些功能。

包含几个缓存客户端

  • ApcuClient
  • FilecacheClient
  • MemcachedClient
  • MemoryClient

以及一些可以提供额外功能的包装器

  • IgnoreThrowablesWrapper:拦截其包装的缓存客户端发出的所有Throwable,并静默抑制它们。
  • CascadeWrapper:允许多个缓存客户端协同工作,以提供超局部缓存响应时间,逐渐向外扩展到更不局部/更慢的缓存。

PSR-16 "Caching Libraries的通用接口"的文档可以在这里找到:https://www.php-fig.org/psr/psr-16/

基本用法

  1. 实例化一个缓存客户端
  2. 在构造函数中使用缓存客户端实例化Beryllium\Cache
  3. 如果需要,设置自定义TTL或自定义前缀
$client = new Beryllium\Cache\Client\FilecacheClient(__DIR__ . '/cache/');
$cache  = new Beryllium\Cache\Cache($client);

// One Hour Time-To-Live
$cache->setTtl(3600);

// Prefix Filenames with extra information, such as 'www-'
$cache->setPrefix('www-');

现在您可以在缓存中获取/设置项

$cache->set('latest-news-items', $newsArray);

$cache->get('latest-news-items', []);

额外功能

默认TTL

Beryllium\Cache允许您设置一个默认TTL,该TTL将传递给缓存客户端,以及附加到每个键上的键前缀。例如,这可以用于命名空间。

在上面的示例中,用于缓存的磁盘上创建的文件将命名为%current_dir%/cache/www-latest-news-items_file.cache

前缀

Beryllium.Cache支持使用特定字符串对键进行"前缀化",这在某些缓存系统中可能很有用。例如,在FilecacheClient中,这可能有助于始终识别缓存的文件。

缓存客户端类

ApcuClient

APCu(Alternate PHP Cache - user)是一种使用共享PHP内存堆栈作为跨进程缓存系统的方法。添加到堆栈的项目可以被使用相同堆栈的其他进程访问。

我不确定这完全有道理,但无论如何,它可能是一个非常强大且快速的缓存系统。

需要安装并启用APCu扩展。注意,在CLI模式下默认禁用此扩展。

配置

$client = new Beryllium\Cache\Client\ApcuClient();
$cache  = new Beryllium\Cache\Cache($client);
$cache->setPrefix('apcu-cache:');

因为此扩展在CLI上被禁用,所以您必须设置命令行上的INI值才能运行此客户端的单元测试

php -d apc.enable_cli=1 vendor/bin/phpunit

如果在未安装APCu的系统上尝试加载此扩展,由于找不到方法,类将生成致命错误。如果您需要它静默失败,例如,如果您正在使用Cascade包装器,您可以将其包装在IgnoreThrowablesWrapper中以静默致命错误。或者安装APCu。哪个适合您。

FilecacheClient

文件系统是缓存某些类型数据的好方法。我不知道这些类型是什么,但我非常确定这个说法是正确的。

配置

$path   = __DIR__ . '/../../somewhere/over/the/rainbow';
$client = new Beryllium\Cache\Client\FilecacheClient($path);
$cache  = new Beryllium\Cache\Cache($client);
$cache->setPrefix('what-a-wonderful-world-');

此库中"前缀"功能的存在原因大部分都包含在原始的FilecacheClient概念中。 :)

如果路径不存在,可能会导致错误状态 - 但库将尝试创建它并确保它是可写的。

由于此客户端使用PHP的serialize/unserialize功能,因此应将其视为相当不安全。任何可以修改缓存文件的过程都有可能在调用unserialize时劫持PHP进程。至少,其他项目中记录的几个漏洞似乎可以追溯到不安全的反序列化。

在此方面使事物更安全,如果能得到帮助将不胜感激。

我已经将序列化/反序列化功能分离成方法,因此如果您愿意,可以扩展 FilecacheClient 并覆盖序列化机制。

MemcachedClient

Memcache 是一个功能强大的缓存库。其中一些功能在客户端实现中“隐藏”了,但多亏了 PSR-16,您可以期待缓存以可预测的方式运行。

快速配置

$client = new Beryllium\Cache\Client\MemcachedClient();
$client->addServer('localhost', 11211);
$cache = new Beryllium\Cache\Cache($client);

快速方法是在构造函数中直接实例化 Memcached 类。

注入依赖

如果您愿意,也可以直接注入 Memcached 类。

$memcached = new \Memcached();
$memcached->addServer('localhost', 11211);

$client = new Beryllium\Cache\Client\MemcachedClient($memcached);
$cache  = new Beryllium\Cache\Cache($client);

如果您有多个服务器,注入对象可能是一个更好的选择。

服务器验证器

MemcachedClient 还包含一个“服务器验证器”,在尝试与服务器交互之前会尝试确保服务器在线。

“验证器”完全是可选的,可能成为瓶颈。这种行为是以前实现遗留的。或许可以将其消除?

$memcached = new \Memcached();
$verifier  = new \Beryllium\Cache\Client\ServerVerifier\MemcacheServerVerifier();
$client    = new Beryllium\Cache\Client\MemcachedClient(
    $memcached,
    $verifier
);

$client->addServer('localhost', 11211);
$cache = new Beryllium\Cache\Cache($client);

MemoryClient

此客户端将缓存项存储在自身内部的数组中。主要用于测试,但也可能作为加速单个请求内处理的手段。

配置

$client = new Beryllium\Cache\Client\MemoryClient();
$cache  = new Beryllium\Cache\Cache($client);

缓存包装类

IgnoreThrowablesWrapper

此包装器封装了一个嘈杂的客户端类,并确保没有异常或错误从其中逃逸。通常这会导致客户端静默失败,这在您希望缓存配置在找不到函数错误时不爆炸时很有用。

或者找不到路径/路径不可写错误。

配置

$client = new Beryllium\Cache\Client\ApcuClient();
$ignore = new Beryllium\Cache\Wrapper\IgnoreThrowablesWrapper($client);
$cache  = new Beryllium\Cache\Cache($ignore);
$cache->setPrefix('apcu-cache:');

CascadeWrapper

Cascade 包装器允许您堆叠缓存客户端,以便对 ->get() 的调用首先检查最近的/最快的缓存(MemoryClient 或 ApcuClient),然后开始更远地寻找所需数据(Memcache,Filecache)。

调用 ->set() 将依次将 ->set() 传递给每个客户端。

如果调用 ->enableBackfill(),则成功的 ->get() 调用也将对所有缓存目标进行 set,确保完整缓存被填充。

配置

$client1 = new Beryllium\Cache\Client\MemoryClient();
$client2 = new Beryllium\Cache\Client\ApcuClient();
$client3 = new Beryllium\Cache\Client\MemcachedClient();
$client4 = new Beryllium\Cache\Client\FilecacheClient('/mnt/tmp/cache');
$cascade = new Beryllium\Cache\Wrapper\CascadeWrapper(
    $client1,
    $client2,
    $client3,
    $client4
);

$client3->addServer('localhost', 11211);

$cache = new Beryllium\Cache\Cache($cascade);