radebatz/acache

另一个缓存库。

2.0.2 2018-12-03 19:37 UTC

README

Build Status Coverage Status License: MIT

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 警告

下一步