zoukankan      html  css  js  c++  java
  • 关于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)

  • 相关阅读:
    scp命令
    js代码片段
    js创建request对象与ajax请求
    多个action组成一个文件
    ng-option选项禁用
    IE日期
    ui-sortable
    P5多语言默认语言不生效BUG的解决办法
    防止多次点击提交按钮造成数据多次提交
    c#根据ip获取地理位置
  • 原文地址:https://www.cnblogs.com/csnd/p/11800560.html
Copyright © 2011-2022 走看看