matomo/cache

基于 Doctrine cache 的 PHP 缓存库

2.0.6 2023-01-18 14:01 UTC

README

这是一个基于 Doctrine cache 的 PHP 缓存库,支持多种后端。在 Matomo 中,我们开发了这个库,重点是速度,因为我们大量使用缓存,有时在单个请求中会从缓存中检索数百个条目。

Build Status

安装

使用 Composer

{
    "require": {
        "matomo/cache": "*"
    }
}

支持的后端

  • 数组(只在单个请求中保持缓存条目,但非常快)
  • 空(适用于开发,不会缓存任何内容)
  • 文件(将缓存条目存储在文件系统中)
  • Redis(将缓存条目存储在 Redis 服务器上,需要 phpredis
  • 链式(允许连接多个后端,以确保尽可能从快速缓存中读取)
  • DefaultTimeout 和 KeyPrefix 可以用来封装其他后端,并使用默认参数。

Doctrine cache 提供了对更多后端的支持,添加其中一个后端很容易。例如

  • APC
  • Couchbase
  • Memcache
  • MongoDB
  • Riak
  • WinCache
  • Xcache
  • ZendData

如果您添加了其中一个,请发送一个 pull request。

不同的缓存

这个库包含三种不同类型的缓存。当前的命名不是最优的。

懒惰的

这可以被认为是默认的缓存,如果您不知道要选择哪个。懒惰的缓存适用于任何后端,因此您可以选择是否要在请求之间持久化缓存条目。它不支持任何对象的缓存。只支持布尔值、数字、字符串和数组。每次您从缓存中请求条目时,它都会从定义的后端再次获取条目,这可能会根据您的应用程序造成许多读取。

热切的

这个缓存将所有缓存条目存储在一个可配置的后端的“缓存”条目下。

这对于需要非常频繁的东西非常有用,几乎在每个请求中都需要。不需要从文件中读取例如一百个缓存条目,只需加载一个包含一百个键的缓存条目。应仅用于需要非常频繁的东西,并且仅用于不太大以至于可以快速加载和解析单个缓存条目的缓存条目。如果您使用的是文件或数据库等慢速后端,这个缓存将更有用。而不是有上百个状态调用,将只有一个。它包含的所有缓存条目都具有相同的生命周期。为了快速性能,它不会验证任何缓存 ID。使用此缓存无法缓存任何对象。

瞬时的

这个类用于在单个请求中缓存任何数据。它不会持久化。

所有缓存条目将存储在一个简单的数组中,这意味着保存和检索缓存条目非常快。您可以通过使用一个惰性缓存和后端(如数组缓存)来实现相同的效果,但这个会更快,因为它不会验证任何缓存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调用。如果您删除缓存条目,它将从所有配置的后端中删除。您可以链接任何后端。建议首先列出更快的后端。

使用DefaultTimeoutKeyPrefix创建装饰后端

$options = array(
    'backend'   => 'array',
    'array'     => array(),
    'keyPrefix' => 'someKeyPrefixStr'
);
$factory = new \Matomo\Cache\Backend\Factory();
$backend = $factory->buildBackend('keyPrefix', $options);

有时设置默认的timeout参数以强制防止无限生命周期,或指定键前缀以防止不同版本的app读取和写入相同的缓存条目是非常有用的。
DefaultTimeoutKeyPrefix是“装饰器”,用于包装另一个后端。目前每个都接受一个与后端同名的单个配置参数。

创建惰性缓存

惰性缓存的描述。

$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();

许可证

Cache组件在LGPL v3.0下发布。

变更日志

  • 0.2.5:更新到doctrine/cache 1.4,其中包含我们的修复
  • 0.2.4:如果缓存目录不存在,则在清除文件缓存时不要抛出异常
  • 0.2.3:修复文件缓存中的另一个竞态条件
  • 0.2.2:修复文件缓存中的竞态条件
  • 0.2.0:初始发布