我现在在尝试写一个PSR-6的实现
当我在实现CacheItemPoolInterface接口时,对于save方法感到困惑,save方法只接收一个CacheItemInterface类型的参数,但是CacheItemInterface这个接口却没有提供类似getExpireTime的方法,这就导致CacheItemPoolInterface没有办法获取到缓存项的过期时间,也就没办法正确地将数据写入到缓存存储里。
我看过几个比较著名的PSR-6实现,例如 symfony/cache php-cache/cache tedious/Stash 然而这些实现版本在实现save方法时并不是非常优雅。
比如symfony/cache
public function save(CacheItemInterface $item) { if (!$item instanceof CacheItem) { return false; } if ($this->deferred) { $this->commit(); } $this->deferred[$item->getKey()] = $item; return $this->commit(); }
这个save方法只有传入Symfony\Component\Cache\CacheItem类型的参数才可以,传入其他类型都会返回false。
目前的情况是,如果想要写一个用到缓存的类库,就必须指定一个具体的PSR-6实现作为依赖,而不仅仅是psr/cache。而反观PSR-3这个日志接口,要写一个需要日志功能的类库,只需要引入psr/log即可,不需要具体实现。
在我看来,PSR-6并不需要CacheItemInterface这个接口,只需要把save方法修改成save($key, $value, $expire_at)即可。
引用来自“leo108”的评论
@南湖船老大 @eechen @宏哥 @都市网达 @Tuesday @OSC首席键客 大神们都来说说看没有细看你的问题。大概看了下你的描述,应该是PSR-6的缓存,使用接口是考虑到多种缓存的实现和适配。CacheItem 就是一个包含key和value,以及expireTime的实体吧,这个实体实现了一些接口。
而你更习惯用的save($key, $value, $expire_at),不过是把缓存对象拆开来。
CacheItemInterface不是有两个方法可以设置过期时间吗?
并不需要类似getExpireTime方法的功能。
你只要把过期时间传进去之后,其他的里面怎么搞不就随便你了。
看了在OSC是讨论不起来了
发一些国外的讨论贴
https://www.reddit.com/r/PHP/comments/3vu9dy/psr6_is_about_to_pass_and_still_has_serious/
http://blog.ircmaxell.com/2014/10/an-open-letter-to-php-fig.html
http://blog.ircmaxell.com/2014/10/a-followup-to-open-letter-to-php-fig.html
https://groups.google.com/forum/?fromgroups#!searchin/php-fig/psr$206/php-fig/Qr4OxCf7J5Y/OVzzM3rOBwAJ
引用来自“都市网达”的评论
我觉得这个标准很难实现,比如我们的业务会主要使用redis,主要使包含Storage/Cache,支持不同的数据结构,如果单单使用save($key, $value, $expire_at),不能满足业务需求。当然我如果cache能出一个标准接口,非常之好,我们在项目之中用到各种操作缓存的扩展类,doctrine/cache或predis,如果都能统一标准,维护成本或新人学习成本来说都是一个好事。你说的使用某个具体缓存DB的情况,实际上并不需要再加一层接口做抽象,因为根本没法抽象,我这里讨论的场景,只是简单的KV存储。
PSR16 Simple Cache 已经在讨论这个事情了,只不过目前还是草稿状态,不知道啥时候能正式成为标准。
我在packagist上面搜索cache,其他一些比较出名的缓存库,例如doctrine/cache sonata-project/cache illuminate/cache等,都没有选择遵循PSR-6
引用来自“leo108”的评论
引用来自“都市网达”的评论
我觉得这个标准很难实现,比如我们的业务会主要使用redis,主要使包含Storage/Cache,支持不同的数据结构,如果单单使用save($key, $value, $expire_at),不能满足业务需求。当然我如果cache能出一个标准接口,非常之好,我们在项目之中用到各种操作缓存的扩展类,doctrine/cache或predis,如果都能统一标准,维护成本或新人学习成本来说都是一个好事。你说的使用某个具体缓存DB的情况,实际上并不需要再加一层接口做抽象,因为根本没法抽象,我这里讨论的场景,只是简单的KV存储。
PSR16 Simple Cache 已经在讨论这个事情了,只不过目前还是草稿状态,不知道啥时候能正式成为标准。
我在packagist上面搜索cache,其他一些比较出名的缓存库,例如doctrine/cache sonata-project/cache illuminate/cache等,都没有选择遵循PSR-6
等PSR-6标准正式出来之后,就会有出现新的扩展,代替原来的