koded / cache-simple
支持多种缓存技术的PSR-16缓存库。支持Redis中的JSON数据缓存。
Requires
- php: ^8.1
- ext-json: *
- koded/stdlib: ^6.3
- psr/log: ^3
- psr/simple-cache: ^3.0
Requires (Dev)
- cache/integration-tests: dev-master
- mikey179/vfsstream: ^1
- phpbench/phpbench: ^1
- phpunit/phpunit: ^9
- predis/predis: ^2
- symfony/phpunit-bridge: ^6.0.x-dev
Suggests
- ext-igbinary: For Redis igbinary support
- ext-memcached: For caching in Memcached
- ext-msgpack: For de/serializing cached data
- ext-redis: For caching in Redis
- ext-shmop: For shared-memory caching
- predis/predis: For using Redis without ext-redis extension
README
这是一个使用多种缓存技术的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% |
+-----------------+-----------+-----------+-----------+--------+
许可证
代码根据3-Clause BSD许可证的条款进行分发。