PHP-FIG
PHP-FIG 是指PHP Framework Interop Group(PHP框架互操作性小组),是一个由PHP社区成员组成的团体,旨在为PHP项目制定标准和规范,以提高不同PHP框架之间的互操作性和可移植性。该小组的成员来自不同的PHP框架和项目,如Symfony、Laravel、Zend Framework等。
PHP-FIG 制定的标准和规范通常被称为PSR(PHP Standard Recommendations),目前已经发布了多个PSR。这些规范包括自动加载规范、代码风格规范、HTTP消息接口规范、容器规范、事件规范等。
PHP-FIG 的底层原理是通过制定规范和标准来解决PHP项目之间的互操作性和可移植性问题。由于不同的PHP框架和项目有不同的代码风格、类库和架构,导致它们之间的代码无法共享和重用。PHP-FIG的规范和标准为PHP项目提供了一种统一的方法和标准,以确保它们可以互相配合工作。这不仅可以提高PHP项目之间的互操作性和可移植性,还可以减少重复的劳动和提高开发效率。
PSR-6 vs PSR-16
PHP 框架互操作组 (PHP-FIG) 提供了两项与缓存相关的公认建议:PSR-6(缓存接口)和 PSR-16(简单缓存)。我们将看看这两个 PSR 以找出它们之间的区别。
PSR-6
PSR-6 为缓存系统提供了一个通用接口。经过不少于四年的工作,于2015年12月8日被PHP-FIG接受。(缓存是一个相当复杂的主题,一些保留意见仍然存在,投票结果证明了这一点)
建议的目标
PSR-6 的目标是“允许开发人员创建可以集成到现有框架和系统中的缓存感知库,而无需进行定制开发。” (资源)
基本上,这意味着缓存库的开发人员不必为他们的库提供大量的适配器类来使用不同的框架。
PSR 的范围是明确定义的,并且不包括一些高级缓存功能,例如命名空间或标记。 但是,一些 PSR-6 实现确实提供了这些功能。
术语
PSR-6 基于缓存池和缓存池项的概念。 池是缓存后端的抽象,例如 Redis 或 APCu。 它是池项的集合,它们是缓存在该后端的键值对。 项目通过其唯一的、不可变的密钥从池中检索并存储到池中。
执行
该建议在 PsrCache 命名空间中提供了四个接口。
尽管命名不是很直观,但很容易猜到 CacheItemInterface 和 CacheItemPoolInterface 分别代表缓存池项和缓存池。
请注意,通过其键检索项目不会产生存储在缓存中的实际值,而是一个实现 CacheItemInterface 的对象。 要测试是否发生缓存命中,请在缓存项上调用方法 isHit(),如以下代码片段所示。 要检索实际值,请在缓存项对象上调用 get() 方法。
代码语言:javascript复制$pool = new Psr6Implementation();
$item = $pool->getItem("foo");
if ($item->isHit() === false) {
$value = "bar"; // IRL: Fetch from database, compute value, ...
$item->set($value);
$pool->save($item);
} else {
$value = $item->get();
}
return $value;
PSR-6 提供了丰富的接口来处理各种缓存后端。 除了检索和存储单个项目之外,它还提供处理项目集合的方法,以及以延迟方式保存项目并批量提交它们的可能性。
至于简单性,接口可能不是超级简单,因为池不会立即返回实际的缓存值。 相反,将返回一个 CacheItemInterface 实例以进行操作。
PSR-16
PSR-16 在 PSR-6 之后于 2017 年 1 月 2 日被 PHP-FIG 接受。最终投票显示明确批准,24 票赞成,3 票反对。
建议的目标
PSR-16 努力为缓存操作提供比 PSR-6 更简单的接口,但范围更有限。
术语
PSR-16 没有缓存池和缓存项的概念——它只是抽象缓存。
实现
建议在 PsrSimpleCache 命名空间中提供三个接口。其中两个是 PSR-6 中已知的相同例外。第三个是实际的 CacheInterface。
PSR-16 看起来很像您对典型键值存储接口的期望,具有 get() 和 set() 方法接受键和值参数以及可选的默认值和 TTL 参数。
使用 PSR-16 重新访问上面的示例会产生类似于以下代码段的代码:
代码语言:javascript复制$cache = new Psr16Implementation();
if ($cache->has("foo") === false) {
$value = "bar"; // IRL: Fetch from database, compute value, ...
$cache->set("foo", $value); // Omitting try-catch clause for brevity
} else {
$value = $cache->get("foo");
}
return $value;
如果您不想在缓存未命中的情况下设置该值,则可以将代码简化为
代码语言:javascript复制$cache = new Psr16Implementation();
return $cache->get("foo", "bar");
使用 PSR-16 可能会产生更简短的代码,因为我们只处理一个缓存对象——没有缓存池和项目。也就是说,我们没有得到 PSR-6 提供的那么多功能,即延迟缓存写入的能力。
结论
PSR-6 提供了一个通用的缓存接口,能够覆盖边缘情况。它还具有一些高级缓存技术。对于更简单的用例,使用缓存系统的开发人员可能更容易理解较新的 PSR-16。
幸运的是,这不是严格意义上的非此即彼! PsrCacheCacheItemPoolInterface
和 PsrSimpleCacheCacheInterface
只声明了一个同名方法clear()
。 由于两个声明具有相同的签名,只要需要 5.3.9 或更高版本的 PHP 依赖项,任何缓存系统都可以实现这两个接口。
PHP Cache 是一个缓存系统,其适配器实现了 PSR-6 和 PSR-16 接口。 此外,Symfony 3.3 提供了将 PSR-6 缓存池转换为 PSR-16 缓存的适配器,反之亦然。