PHP规范PSR16(缓存库的通用接口)介绍

本文档描述了缓存项和缓存驱动程序的简单但可扩展的接口。

本文档中的关键词“必须”,“必须”,“必需”,“应该”,“不应该”,“应该”,“不应该”,“推荐”,“可以”和“可选”按照RFC 2119中的描述进行解释。

最终的实现可以使用比提出的功能更多的功能来装饰对象,但是它们必须首先实现所指示的接口/功能。

1 介绍

缓存是提高任何项目性能的常用方法,使缓存库成为许多框架和库的最常见功能之一。此级别的互操作性意味着库可以删除自己的缓存实现,并且可以轻松地依赖于框架或其他专用缓存库给予它们的实现。

PSR-6已经解决了这个问题,但是以一种相当正式和冗长的方式解决了最简单的用例所需要的问题。这种更简单的方法旨在为常见情况构建标准化的简化界面。它独立于PSR-6,但设计为尽可能简单地与PSR-6兼容。

2 定义

调用库,实现库,TTL,到期和密钥的定义从PSR-6复制,因为相同的假设是正确的。

(1)调用库 - 实际需要缓存服务的库或代码。该库将利用实现此标准接口的缓存服务,但不会知道这些缓存服务的实现。

(2)实现库 - 该库负责实现此标准,以便为任何调用库提供缓存服务。实现库必须提供一个实现Psr \ SimpleCache \ CacheInterface接口的类。实现库必须支持至少TTL功能,如下所述,具有全秒级粒度。

(3)TTL - 项目的生存时间(TTL)是该项目存储与被认为是陈旧之间的时间量。 TTL通常由表示以秒为单位的时间的整数或DateInterval对象定义。

(4)到期 - 项目设置为失效的实际时间。这是通过将TTL添加到存储对象的时间来计算的。在1:30:00存储300秒TTL的项目将到期为1:35:00。实现库可以在其请求的到期时间之前使项目到期,但是一旦达到其到期时间,必须将项目视为已过期。如果调用库要求保存项目但未指定过期时间,或指定空过期时间或TTL,则实现库可以使用配置的默认持续时间。如果没有设置默认持续时间,则实现库必须将其解释为永久缓存项目的请求,或者只要底层实现支持。如果提供了负TTL或零TTL,则必须从缓存中删除该项(如果存在),因为它已经过期。

(5)Key - 至少一个字符的字符串,用于唯一标识缓存的项目。实现库必须支持由字符A-Z,a-z,0-9,_和组成的键。以UTF-8编码的任何顺序,长度最多为64个字符。实现库可以支持其他字符和编码或更长的长度,但必须至少支持该最小值。库负责自己的密钥字符串转义,但必须能够返回原始未修改的密钥字符串。以下字符保留用于将来的扩展,并且实现库不得支持:{}()/ \ @:

(6)Cache - 实现Psr \ SimpleCache \ CacheInterface接口的对象。

(7)高速缓存未命中 - 高速缓存未命中将返回null,因此检测是否存在一个存储的空值。这是PSR-6假设的主要偏差。

3 Cache

实现可以为用户提供一种机制,以指定默认TTL(如果没有为特定缓存项指定TTL)。如果没有提供用户指定的默认值,则实现必须默认为底层实现允许的最大合法值。如果底层实现不支持TTL,则必须静默忽略用户指定的TTL。

4 数据

实现库必须支持所有可序列化的PHP数据类型,包括:

  • 字符串 - 任何PHP兼容编码中任意大小的字符串。
  • 整数 - PHP支持的任何大小的所有整数,最多64位签名。
  • 浮点数 - 所有带符号的浮点值。
  • 布尔值 - 真和假。
  • Null - 空值(尽管在读取它时它不能与高速缓存未命中区分)。
  • 数组 - 任意深度的索引,关联和多维数组。
  • Object - 支持无损序列化和反序列化的任何对象,以便$ o == unserialize(serialize($ o))。对象可以使用PHP的Serializable接口,__sleep()或__wakeup()魔术方法,或者适当的类似语言功能。

传递到实现库的所有数据必须完全按照传递的方式返回。这包括变量类型。也就是说,返回(字符串)5是错误的,如果(int)5是保存的值。实现库可以在内部使用PHP的serialize()/ unserialize()函数,但不是必须这样做。与它们的兼容性仅用作可接受对象值的基线。

如果由于任何原因无法返回确切的保存值,则实现库必须以缓存未命中而不是损坏的数据进行响应。

猜你喜欢

转载自blog.csdn.net/u013702678/article/details/83549416