关于PHP PSR6合理性讨论

leo108 发布于 2016/08/05 16:09
阅读 680
收藏 1
PHP

开源之夏第三届火热来袭,高校学生参与赢万元奖金!>>>

我现在在尝试写一个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)即可。

加载中
0
leo108
leo108
@南湖船老大 @eechen @宏哥 @都市网达 @Tuesday @OSC首席键客 大神们都来说说看
0
宏哥
宏哥

引用来自“leo108”的评论

@南湖船老大 @eechen @宏哥 @都市网达 @Tuesday @OSC首席键客 大神们都来说说看
我根本不用interface这些特性
eechen
eechen
不想把时间浪费在"八股文"的"条条框框"上
0
南湖船老大
南湖船老大

没有细看你的问题。大概看了下你的描述,应该是PSR-6的缓存,使用接口是考虑到多种缓存的实现和适配。CacheItem 就是一个包含key和value,以及expireTime的实体吧,这个实体实现了一些接口。

而你更习惯用的save($key, $value, $expire_at),不过是把缓存对象拆开来。

leo108
leo108
回复 @南湖船老大 : 那只能说这个标准没有任何意义,并没有改变cache库接口不统一的现象,各大框架还是各自为战
南湖船老大
南湖船老大
回复 @leo108 : 应该说是PSR-6抽象程度更高了
leo108
leo108
并不是习惯问题,而是PSR-6是一个无法实现或者说并没有达到成为规范的目的
0
OSC688888
OSC688888

CacheItemInterface不是有两个方法可以设置过期时间吗?

并不需要类似getExpireTime方法的功能。

你只要把过期时间传进去之后,其他的里面怎么搞不就随便你了。

OSC688888
OSC688888
回复 @leo108 :缓存过期时间,外部程序并不需要知道,他只需要设置就可以了。
OSC688888
OSC688888
回复 @leo108 : 它有set没有get确实有点怪,可能是想让你自己去写怎么取吧。已经有设置过期时间的方法了,怎么取自己实现也没有什么问题,我看并不影响这个接口。
leo108
leo108
CacheItemInterface只是一个payload,本身并不会去操作后端的存储,因此那两个设置过期时间的方法只是修改了php内存里的数据。真正去操作后端存储的是CacheItemPoolInterface,所以Pool才是需要知道过期时间的,而CacheItemInterface却并没有提供读取的方法
0
Tuesday
Tuesday
该评论暂时无法显示,详情咨询 QQ 群:点此入群
开源无憾
正解。
0
leo108
leo108

看了在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


0
大王叫我来卖萌
大王叫我来卖萌
PHP本来就是简单灵活的,不想被这些条条框框限制
0
Null--Null
Null--Null
我觉得这个标准很难实现,比如我们的业务会主要使用redis,主要使包含Storage/Cache,支持不同的数据结构,如果单单使用save($key, $value, $expire_at),不能满足业务需求。当然我如果cache能出一个标准接口,非常之好,我们在项目之中用到各种操作缓存的扩展类,doctrine/cache或predis,如果都能统一标准,维护成本或新人学习成本来说都是一个好事。
0
leo108
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

0
Null--Null
Null--Null

引用来自“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标准正式出来之后,就会有出现新的扩展,代替原来的

leo108
leo108
PSR6已经是标准了,PSR16还是草稿
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部