koded/cache-simple

支持多种缓存技术的PSR-16缓存库。支持Redis中的JSON数据缓存。

3.1.0 2023-10-16 19:58 UTC

README

Latest Stable Version Build Status Code Coverage Scrutinizer Code Quality Packagist Downloads Minimum PHP Version

这是一个使用多种缓存技术的PSR-16缓存库,适用于PHP 8。它支持Redis的JSON缓存。

需求

该库在Windows操作系统上未经测试,可能无法按预期运行。

建议的安装方法是使用 Composer

composer require koded/cache-simple

Redis

使用Redis扩展,Redis有两个客户端版本:

它们不是互相排斥的。

这些客户端支持缓存中的JSON序列化,这对于在其他编程语言中处理缓存数据非常有用。

由于Redis本身不支持JSON序列化,这是在用户空间中完成的,因此始终会引入一些开销。请注意,PHP和Igbinary函数更优越。

  • 如果已安装Redis扩展,则首选 RedisClient
  • 否则可以使用 PredisClient
// with Redis extension
simple_cache_factory('redis');

// with Predis library
simple_cache_factory('predis');

Memcached

请安装 Memcached扩展

用法

工厂函数始终创建特定 SimpleCacheInterface 客户端实现的实例。

/*
 * Creates a simple cache instance
 * with MemcachedClient and default configuration
 */

$cache = simple_cache_factory('memcached');
/*
 * Some configuration directives for the cache client
 * are passed in the second argument as array
 */

$cache = simple_cache_factory('redis', [
    'host'       => '127.0.0.1',
    'serializer' => 'json',
    'prefix'     => 'test:',
    'ttl'        => 3600 // 1 hour global TTL
]);

相同实例的构建稍微有点冗长:

$config = new ConfigFactory(['serializer' => 'json', 'prefix' => 'test:', 'ttl' => 3000]);
$cache = (new ClientFactory($config))->new('redis');

配置指令

当前可用的配置类

RedisConfiguration

请参阅 Redis扩展连接 方法。

// Without defining the parameters the above directives are used as default
$cache = simple_cache_factory('redis');

序列化器

  • php (默认)
  • json

特殊的配置指令是 binary(string),用于设置内部序列化函数为PHP原生的 un/serialize()igbinary_un/serialize()msgpack_un/pack()

$cache = simple_cache_factory('redis', [
    'binary' => \Koded\Stdlib\Serializer::MSGPACK
]);

如果安装并加载了 igbinary 和/或 msgpack 扩展,则 binary 指令有效。否则,它默认为PHP un/serialize() 函数。

您可以在已缓存的现有数据上更改二进制标志,但应该使先前缓存的条目无效,因为它们已经序列化并存储在缓存中。

JSON序列化器选项

json_encode() 函数的默认选项是

  • JSON_PRESERVE_ZERO_FRACTION
  • JSON_UNESCAPED_SLASHES
  • JSON_THROW_ON_ERROR

要设置所需的选项,请使用 options 配置指令

$cache = simple_cache_factory('redis', [
    'serializer' => 'json',
    'options' => JSON_UNESCAPED_SLASHES | JSON_FORCE_OBJECT
]);

JSON选项使用位掩码运算符应用。上面的示例将

  • 移除 JSON_UNESCAPED_SLASHES(因为它已经设置)
  • 添加 JSON_FORCE_OBJECT

MemcachedConfiguration

当创建 MemcachedConfiguration 实例时,以下选项默认设置,但 OPT_PREFIX_KEY 除外,它作为一个提醒,表示可能已设置。

具有 NULL 值的选项将被移除。

有许多 Memcached选项 可能适合特定的缓存场景,这是开发人员需要解决的问题。

示例

[
    // Memcached client `persistent_id`
    'id' => 'items',

    // your Memcached servers list
    'servers' => [
        ['127.0.0.1', 11211],
        ['127.0.0.2', 11211],
        ['127.0.0.2', 11212],
    ],

    // Memcached client options
    'options' => [
        \Memcached::OPT_PREFIX_KEY            => 'i:',  // cache item prefix
        \Memcached::OPT_REMOVE_FAILED_SERVERS => false, // changes the default value
        \Memcached::OPT_DISTRIBUTION          => null   // remove this directive with NULL
    ],

    // the global expiration time (for ALL cached items)
    'ttl' => 120,
]

PredisConfiguration

默认参数如下

示例

$cache = simple_cache_factory('predis');
$cache = simple_cache_factory('predis', [
    'scheme' => 'unix',
    'path' => '/path/to/redis.sock',
    'options' => [
        'prefix' => 'i:',
        'exceptions' => true,
        'parameters' => [
            'password' => getenv('REDIS_PASSWORD'),
            'database' => 1
        ]
    ]
]);

本包有许多配置选项。请参阅Predis配置页面

共享内存(shmop)

需要PHP shmop扩展

$cache = simple_cache_factory('shmop', [
    'dir' => '/path/to/app/cache', // optional
    'ttl' => null,                 // global TTL
]);

FileConfiguration

请避免在生产环境中使用它,或者将其作为最后的选择。

如果配置中没有提供缓存目录,PHP函数sys_get_temp_dir()将被用来在操作系统的“临时”目录中存储缓存文件。

$cache = simple_cache_factory('file', ['dir' => '/tmp']);

MemoryClient

此客户端将在脚本生命周期的持续时间内在内存中存储缓存项。这对于开发很有用,但不适用于生产。

MemoryClient也是如果您在cache_simple_factory()中不需要特定客户端时的默认客户端

$cache = simple_cache_factory('memory');
$cache = simple_cache_factory();  // also creates a MemoryClient

代码质量

vendor/bin/phpunit
vendor/bin/phpbench run --report=default --group=factory
vendor/bin/phpbench run --report=default --group=read-write

或者

vendor/bin/phpbench run --report=benchmark --group=read-write

基准测试

基准测试是不可靠的,并且依赖于环境。此表格给出了客户端在写-读-删除操作中表现的非精确洞察,并且应该有一个信息性的比较。

要找出您环境中最快的选项,请运行

vendor/bin/phpbench run --report=default --group=read-write

+-----------------+-----------+-----------+-----------+--------+
| subject         | best      | mean      | worst     | rstdev |
+-----------------+-----------+-----------+-----------+--------+
| bench_predis    | 1.354ms   | 1.403ms   | 1.431ms   | ±2.49% |
| bench_redis     | 581.000μs | 592.667μs | 609.000μs | ±2.01% |
| bench_memcached | 581.000μs | 593.333μs | 606.000μs | ±1.72% |
| bench_file      | 355.000μs | 367.667μs | 385.000μs | ±3.45% |
| bench_shmop     | 349.000μs | 364.000μs | 374.000μs | ±2.97% |
| bench_memory    | 77.000μs  | 79.667μs  | 82.000μs  | ±2.58% |
+-----------------+-----------+-----------+-----------+--------+

许可证

Software license

代码根据3-Clause BSD许可证的条款进行分发。