piwik / cache
Requires
- php: >=7.1
- matomo/doctrine-cache-fork: 1.10.4
Requires (Dev)
- phpunit/phpunit: ~7.0
README
这是一个基于 Doctrine cache 的 PHP 缓存库,支持不同的后端。在 Matomo 中,我们开发了这个库,重点是速度,因为我们大量使用缓存,有时在一个请求中会从缓存中获取数百条条目。
安装
使用 Composer
{ "require": { "matomo/cache": "*" } }
支持的后端
- Array (仅在一个请求中保存缓存条目,但速度很快)
- Null (适用于开发,不会缓存任何内容)
- File (将缓存条目存储在文件系统中)
- Redis (将缓存条目存储在 Redis 服务器上,需要 phpredis)
- Chained (允许链式连接多个后端,以确保尽可能从快速缓存中读取)
- 可以使用 DefaultTimeout 和 KeyPrefix 使用默认参数包装其他后端。
Doctrine cache 提供了对更多后端的支持,添加其中一个很容易。例如
- APC
- Couchbase
- Memcache
- MongoDB
- Riak
- WinCache
- Xcache
- ZendData
如果您添加了其中一个,请发送一个 pull 请求。
不同的缓存
此库包含三种不同类型的缓存。当前的命名并不理想。
Lazy
这可以被认为是默认的缓存,如果您不知道选择哪个。懒缓存可以与任何后端一起使用,因此您可以决定是否希望在请求之间持久化缓存条目。它不支持任何对象的缓存。只支持布尔值、数字、字符串和数组。每次您从缓存中请求条目时,它都会从定义的后端再次获取条目,这可能会导致您的应用程序进行多次读取。
Eager
此缓存将所有缓存条目存储在一个可配置后端的单个 "cache" 条目下。
这对于您需要非常频繁的事情非常有用,几乎在每一个请求中都需要。例如,您不需要从文件中读取一百个缓存条目,只需加载一个包含一百个键的缓存条目即可。应仅用于您需要非常频繁且缓存条目不是太大,以便快速加载和解析单个缓存条目的情况。如果您使用的是像文件或数据库这样的慢速后端,此缓存甚至更有用。例如,如果没有这个缓存,您可能需要一百次状态调用,而现在只需一次。它包含的所有缓存条目都有相同的生命周期。为了快速性能,它不会验证任何缓存 ID。使用此缓存无法缓存任何对象。
Transient
此类用于在单次请求期间缓存任何数据。它不会被持久化。
所有缓存条目都将缓存在一个简单的数组中,这意味着保存和检索缓存条目非常快。您基本上可以通过使用懒缓存和后端(例如数组缓存)来实现相同的效果,但这个会更快,因为它不会验证任何缓存ID,并且允许您缓存任何类型的对象。与懒缓存相比,它不支持设置任何生存时间,因为无论如何它只在一个请求中有效。如果您需要读取数百或数千个缓存条目,并且性能对您非常重要,请使用此选项。
使用方法
创建文件后端
$options = array('directory' => '/path/to/cache'); $factory = new \Matomo\Cache\Backend\Factory(); $backend = $factory->buildBackend('file', $options);
创建Redis后端
$options = array( 'host' => '127.0.0.1', 'port' => '6379', 'timeout' => 0.0, 'database' => 15, // optional 'password' => 'secret', // optional ); $factory = new \Matomo\Cache\Backend\Factory(); $backend = $factory->buildBackend('redis', $options);
创建链式后端
$options = array( 'backends' => array('array', 'file'), 'file' => array('directory' => '/path/to/cache') ); $factory = new \Matomo\Cache\Backend\Factory(); $backend = $factory->buildBackend('redis', $options);
每次您设置缓存条目时,它都会将其保存到数组和文件缓存中。每次您尝试读取缓存条目时,它首先会尝试从快速数组缓存中获取它。如果在那里不可用,它会尝试从文件系统中获取缓存条目。如果缓存条目存在于文件系统上,它将自动使用数组缓存来缓存条目,因此请求内的下一次读取将快速进行,而不会再次触发stat调用。如果您删除缓存条目,它将从所有配置的后端中删除。您可以链式连接任何后端。建议首先列出较快的后端。
创建带有 DefaultTimeout
或 KeyPrefix
的装饰后端
$options = array( 'backend' => 'array', 'array' => array(), 'keyPrefix' => 'someKeyPrefixStr' ); $factory = new \Matomo\Cache\Backend\Factory(); $backend = $factory->buildBackend('keyPrefix', $options);
有时设置默认的超时参数以强制防止无限生存期,或指定键前缀以防止应用程序的不同版本读取和写入相同的缓存条目很有用。
DefaultTimeout
和 KeyPrefix
是“装饰器”,它们包装另一个后端。目前每个都接受一个与后端同名的单个配置参数。
后端 | 参数 | 描述 |
---|---|---|
DefaultTimeout | defaultTimeout |
使用整数值作为默认超时来定义缓存条目的生存期。仅在未指定生存期时生效;防止无限生存期。 |
KeyPrefix | keyPrefix |
为任何操作中的键添加给定值的前缀。例如,'Key123' 将变为 'SomePrefixKey123' |
创建懒缓存
$factory = new \Matomo\Cache\Backend\Factory(); $backend = $factory->buildBackend('file', array('directory' => '/path/to/cache')); $cache = new \Matomo\Cache\Lazy($backend); $cache->fetch('myid'); $cache->contains('myid'); $cache->delete('myid'); $cache->save('myid', 'myvalue', $lifeTimeInSeconds = 300); $cache->flushAll();
创建积极缓存
$cache = new \Matomo\Cache\Eager($backend, $storageId = 'eagercache'); $cache->fetch('myid'); $cache->contains('myid'); $cache->delete('myid'); $cache->save('myid', new \stdClass()); $cache->persistCacheIfNeeded($lifeTimeInSeconds = 300); $cache->flushAll();
它将所有设置的缓存条目缓存到 eagercache
缓存条目下。
创建瞬态缓存
$cache = new \Matomo\Cache\Transient(); $cache->fetch('myid'); $cache->contains('myid'); $cache->delete('myid'); $cache->save('myid', new \stdClass()); $cache->flushAll();
许可
缓存组件是在 LGPL v3.0 许可下发布的。
变更日志
- 0.2.5:更新到 doctrine/cache 1.4,其中包含我们的修复
- 0.2.4:如果缓存目录不存在,则不清除文件缓存时不会抛出异常
- 0.2.3:修复文件缓存中的另一个竞争条件
- 0.2.2:修复文件缓存中的竞争条件
- 0.2.0: 首次发布