radebatz / acache
另一个缓存库。
Requires (Dev)
- cache/cache: ^1.0
- cache/integration-tests: ^0.16.0
- doctrine/cache: ^1.3
- friendsofphp/php-cs-fixer: ^2.13
- phpunit/phpunit: ^5.0|^6.0|^7.0|^8.0
- satooshi/php-coveralls: ~2.0
Provides
- psr/cache-implementation: 1.0.0
README
ACache - 另一个 PHP 缓存库。
<?php require_once __DIR__.'/vendor/autoload.php'; $cache = new Radebatz\ACache\ArrayCache(); $cache->save('yin', 'yang'); echo 'yin and '.$cache->fetch('yin');
ACache 需要 PHP 7.2 或更高版本。
安装
使用以下命令安装最新版本
$ composer require radebatz/acache
特性
ACache 受 doctrine cache 组件的启发。事实上,还有一个装饰器允许你用 ACache 实例代替 doctrine 缓存。
由于一些功能很难添加,我最终写了自己的 :)
命名空间
Radebatz\ACache\Cache
接口允许为任何给定的 id 显式使用命名空间。
<?php include 'vendor/autoload.php'; define('MY_NAMESPACE', 'my'); $cache = new Radebatz\ACache\ArrayCache(); $cache->save('yin', 'yang', MY_NAMESPACE); echo 'my yin and '.$cache->fetch('yin', MY_NAMESPACE).PHP_EOL;
虽然这样工作得很好,但有时更希望这样做得更加透明(并且节省一些打字)。
<?php include 'vendor/autoload.php'; define('MY_NAMESPACE', 'my'); $cache = new Radebatz\ACache\ArrayCache(); // wrap given cache in namespace $myCache = new Radebatz\ACache\NamespaceCache($cache, MY_NAMESPACE); $myCache->save('yin', 'yang'); echo 'my yin and '.$myCache->fetch('yin').PHP_EOL; // or, using the decorated cache directly echo 'my yin and '.$cache->fetch('yin', MY_NAMESPACE).PHP_EOL;
将现有的缓存实例包装在 Radebatz\ACache\NamespaceCache
中,实际上允许在不携带命名空间的情况下对缓存进行分区。
多级
有时,由于重启或其他原因导致丢失并重建缓存可能相当昂贵。应对这种情况的一种方法是多级缓存。
使用快速(非持久)缓存作为主缓存。如果在该缓存中找不到条目(例如,由于重启),则将回退到持久缓存(文件系统、数据库)。只有当查询所有配置的缓存实例后,条目才会被宣布为未找到。
<?php include 'vendor/autoload.php'; // two level cache stack $cache = new Radebatz\ACache\MultiLevelCache(array( new Radebatz\ACache\ArrayCache(), new Radebatz\ACache\FilesystemCache(__DIR__.'/cache') )); // save both in ArrayCache and FilesystemCache $cache->save('yin', 'yang'); // lookup will only use ArrayCache echo 'my yin and '.$cache->fetch('yin').PHP_EOL;
再次运行相同的代码将产生相同的结果,即使注释掉了 save()
调用。
<?php include 'vendor/autoload.php'; $cache = new Radebatz\ACache\MultiLevelCache(array( new Radebatz\ACache\ArrayCache(), new Radebatz\ACache\FilesystemCache(__DIR__.'/cache') )); // save both in ArrayCache and FilesystemCache //$cache->save('yin', 'yang'); // lookup will only use ArrayCache echo 'my yin and '.$cache->fetch('yin').PHP_EOL;
在这里,Radebatz\ACache\ArrayCache
实例将为空,而 Radebatz\ACache\MultiLevelCache
将回退到使用基于文件的缓存来查找(并找到)缓存条目。
嵌套
命名空间和多级缓存实例都可以任意嵌套。
Psr/Cache
所有缓存实例都可以通过包装在 Psr 装饰器中作为 Psr\Cache\CacheItemPoolInterface
实例使用。
use Radebatz\ACache\ArrayCache;
use Radebatz\ACache\Decorators\Psr\CacheItemPool;
$cache = new ArrayCache();
$psrCache = new CacheItemPool($cache);
$cacheItem = $prsCache->getItem('foo');
...
测试
ACache 提供了一套相当完整的测试,用于单个缓存实例,以及多级和命名空间缓存的组合。
许可证
ACache 在 MIT 许可证下授权。
变更日志
所有破坏向后兼容性的问题都被标记为 [BC]。
v1.1.0
- [BC] 将命名空间作为
save()
方法的最后一个参数 [#4] - 添加变更日志以提供升级细节 [#8]
- 添加
DoctrineCache
装饰器类 [#9] - 使自动加载器使用 prs-4
- 允许在 PHPUnit 测试中覆盖默认值 [#12]
- 添加
NullCache
类 [#13]
v1.1.1
- [BC] 允许配置默认生存时间 [#7] 这将
save()
方法的$lifeTime
参数的默认值更改为null
- 向 ApcCache 添加某种形式的 GC [#16]
v1.2.0
- [BC] 将 Apc GC 重构为单独的类 [#18]
v1.2.1
- 向 MultiLevelCache 添加日志支持 [#1]
- 简化多级缓存堆栈验证
v1.2.2
- 添加 psr-6 支持
v1.2.3
- 添加选项允许 ArrayCache 实例共享单个缓存实例 [#27]
- 集成 'cache/integrationtests'(仅限 PHP5.4+)
v1.3.0
- [BC] 重构权限选项 [#32]、[#33]
- 向 FilesystemCache 添加 hardFlush 选项,允许在刷新时删除目录 [#34]
v1.3.1
- 保存已过期的(lifeTime < 0)应类似于删除 [#39]
- 修复 ApcCache::flush() 在 hhvm 中的问题 [#41]
- 修复在从堆中移除不可用的缓存时MultiLevelCace中的无效偏移警告 [#45]
v1.3.2
- 重构 cache/integraton-tests 测试类
- 修复在PHP7中APC被报告为不可用的问题 [#47]
2.0.0
- 停止支持PHP 5.3、5.4并从测试矩阵中移除
- 将PHP 7.1和7.2添加到测试矩阵
2.0.1
- 停止支持PHP 5.5和hhvm
- 与 cache/integration-tests 进行验证
- 在 FilesystemCache 中禁用 chmod/chown/chgrp 警告
- 添加 CS 规则
- 更新开发依赖
2.0.2
- 在 FilesystemCache 中禁用更多 chmod/chown/chgrp 警告