关于YiII框架的扩展memcache中set设置时间就get查询失效的解决方案(版本是1.1.20)

0x01 前言

在使用Yii框架的扩展memcache缓存的时候,存储数据有一个set方法,来看一下set方法的原型:

public boolean set(string $id, mixed $value, integer $expire=0, ....)

第一个参数时设置键名的,第二个参数是设置要缓存的值也就是键值,第三个参数是设置缓存的时间多久失效(默认是0,也就是永远不失效,如果不为0,最大为30天,也就是2592000秒),如果设置为1,就缓存1秒也就是1秒后失效

当不设置缓存的时间时,使用get方法获取键值是没有问题的,如图:
在这里插入图片描述
在这里插入图片描述
但是如果设置了时间,那么get查询就显示为空

先重启一下服务,清除内存中的数据(因为缓存的数据是在内存当中的,服务重启数据丢失,就是没了的意思)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

显示为空,就是查询不到数据

0x02 解决方案

在这里插入图片描述
在这里插入图片描述

打开CMemCache.php的源文件,将注释(注释是原代码)改为红圈圈(红圈圈是改完的)中的行。重启服务后在试一遍

在这里插入图片描述
在这里插入图片描述

发现成功了

在这里插入图片描述
在这里插入图片描述

最后等待10秒后(记得将set注释的,避免重复),缓存值消失,达到了最初的目的

0x03 原理

在这里插入图片描述

这就是文件没有更改时的代码,其中$expire就是我们所要设置的缓存时间的参数。来看一下if分支,假如我们设置的缓存时间不大于0的话,就返回0,也就是永久有效(这个在上面说明过);如果大于0的话,就将缓存的时间加上一个time()函数返回的值,当时我看了一下我的time()函数返回的值是1543045753,之后加上我们设置的缓存时间就远远大于2592000秒(上面有讲过)。所以set方法就没有储存值,当然也查询不到,所以get查询的时候为空

0x04 总结

以上就是set设置时间就get查询失效的解决方案,也算是YII框架中的一个小bug,原理也讲了,希望大家理解

PS:如果认为我这个博客有什么问题或者有修改意见的,请一定要告诉我,非常感谢(我的邮箱2412875746@qq.com)

原文地址:https://www.cnblogs.com/csnd/p/11800560.html