ReactPHP-cache
Cache 组件
为ReactPHP提供的Async和基于Promise的缓存接口。
缓存组件提供了一个基于Promise的CacheInterface和一个内存中的ArrayCache来实现它。
这允许使用者对接口输入提示,并允许第三方提供替代实现。
用法
CacheInterface
CacheInterface定义组件的主要接口。这允许使用者对接口输入提示,并允许第三方提供代替实现。
get()
get(string $key, mixed $default = null): PromiseInterface
方法可以从缓存中取回一个项目(值)。
当成功时,这个方法会返回缓存值,当项目不存在或者发生错误时,这个方法会返回$default
的值。当然,一个过期的项目(一旦生存时间过期)会被缓存丢弃。
$cache->get('foo')->then('var_dump')
这个例子获取了foo
的值,然后把这个值提供给var_dump
方法。你也可以用任何promises
提供的方法。
set()
set(string $key,mixed $value,?float $ttl = null): PromiseInterface
方法可以存储一个项目到缓存中。
当执行成功时,它会返回true
,当发生错误时,它会返回false
。如果缓存实例必须通过网络存储,那可能需要一点时间执行。
可选参数$ttl
可以为缓存项目设置最大生存时间(秒),若这个参数未设置或者设为null
,那这个项目将会一直存储在这个缓存中(缓存实例最大支持时间)。
如果试图访问过期的缓存项目,结果会丢失,请参阅get()
。
$cache->set('foo', 'bar', 60);
这个例子设置了一个键为foo
值为bar
的缓存项目,如果这个项目(键为foo
)已存在,它将被新值覆盖。
delete()
从缓存中删除一个项目.
当执行成功时,它会返回true
,当发生错误时,它会返回false
。当在缓存中没有找到键为$key
的项目,它也会返回true
。如果缓存实例必须通过网络存储,那可能需要一点时间执行。
$cache->delete('foo');
这个例子最终删除了键为foo
的缓存项目。和set()
一样,这可能不会立即发生(删除动作),它会返回一个承诺(promise),以提供是否从缓存中删除项的凭证。
ArrayCache
ArryaCache提供一个CacheInterface的内存实例。
$cache = new ArrayCache();
$cache->set('foo', 'bar');
它的构造函数接受一个可选的参数int $limit
以限制LRU缓存的最大条数。如果你添加超过限制条数的缓存进入这个实例,它将自动移除最近最少使用的LRU缓存。
必须这个例子,这断代码将会覆盖掉第一个值,最终缓存实例中只会存放最近两个值。
$cache = new ArrayCache(2);
$cache->set('foo', '1');
$cache->set('bar', '2');
$cache->set('baz', '3');
常用用法
fallback get
缓存的一个常见用例是尝试获取缓存的值,如果没有找到,则作为回退从原始数据源检索该值。例子如下:
$cache
->get('foo')
->then(function ($result) {
if ($result === null) {
return getFooFromDb();
}
return $result;
})
->then('var_dump');
首先尝试检索foo
的值,当返回值为null
时,被注册的回调函数getFooFromDb
将会被执行。如果查询的项目在缓存中不存在,getFooFromDb(可以再任意PHP中被调用)将会被执行。
getFooFromDb可以通过从数据库(或任何其他数据源)返回对实际值的承诺来处理丢失的键,因此,该链将正确地回调,并在两种情况下提供值。
Fallback get and set
扩展一个get的fallback实例,通常,你从一个数据源中获取一个值后会想把它设置到缓存中去。
$cache
->get('foo')
->then(function ($result) {
if ($result === null) {
return $this->getAndCacheFooFromDb();
}
return $result;
})
->then('var_dump');
public function getAndCacheFooFromDb()
{
return $this->db
->get('foo')
->then(array($this, 'cacheFooFromDb'));
}
public function cacheFooFromDb($foo)
{
$this->cache->set('foo', $foo);
return $foo;
}
通过使用链接,如果从数据库中获取值,您可以很容易地有条件地缓存该值。
安装
推荐使用composer安装这个库。
这将安装最新版本:
$ composer require react/cache:^0.5.0
有关版本升级的详细信息,请参阅变更日志。
这个项目的目标是在任何平台上运行,不需要任何PHP扩展,支持PHP5.3到PHP7+和HHVM版本。极力推荐在项目中使用PHP7+版本。
#Tests
要运行测试,你首先需要复制这个repo,然后通过composer安装所有依赖:
$ composer install
运行测试,到项目根目录然后运行:
$ php vendor/bin/phpunit
License
MIT,查看协议文件