beryllium / cache
提供对众多缓存实现的PHP接口
Requires
- php: >=7.2.0
- psr/simple-cache: ^1.0
Requires (Dev)
- ext-apcu: *
- ext-memcached: *
- mikey179/vfsstream: 1.2.*
- phpunit/phpunit: ^8.3
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/
基本用法
- 实例化一个缓存客户端
- 在构造函数中使用缓存客户端实例化Beryllium\Cache
- 如果需要,设置自定义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);