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)

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

  1. Android开发之注解式框架ButterKnife在ADT中的设置

    使用注解式框架ButterKnife的时候,导入到ADT中,结果项目中注解的view无效,如点击button等无任何的反应. 然后在ButterKnife的官网查看到解决办法:http://jakew ...

  2. java中定时器设置时间

    <!-- 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 0 0 12 ? * WED 表示每个星期三中午1 ...

  3. Python框架学习之Flask中的常用扩展包

    Flask框架是一个扩展性非常强的框架,所以导致它有非常多的扩展包.这些扩展包的功能都很强大.本节主要汇总一些常用的扩展包. 一. Flask-Script pip install flask-scr ...

  4. php扩展memcache和memcached区别?以及memcached软件的介绍

    引用“http://www.vicenteforever.com/2012/03/memcache-different-memcached/” memcached是一个软件,而PHP包括了memcac ...

  5. Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展

    Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展 Receiver是SparkStreaming的输入数据来源,从对Receiver整个生命周期的设计,我们 ...

  6. PHP扩展memcache模

    研究yii当配套部件,发现自己PHP甚至不支持memcache该模块,于是,我就展开位. 本机环境:win8.1 开发环境:php 5.5  第一步:先把所需的文件包下载全然,我已经打包好,这里能够下 ...

  7. windows 下编译php扩展库pecl里的扩展memcache

    Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单的说就是将数据调用到内 ...

  8. Python框架学习之Flask中的数据库操作

    数据库操作在web开发中扮演着一个很重要的角色,网站中很多重要的信息都需要保存到数据库中.如用户名.密码等等其他信息.Django框架是一个基于MVT思想的框架,也就是说他本身就已经封装了Model类 ...

  9. linux-CentOS6.4安装Memcached+memcached扩展+安装memcache扩展+Memcache+mecached同步SESSION的几种方法

    一.编译环境的准备 yum install gcc  yum install gcc-c++ libstdc++-devel  yum install zlib-devel 二.源代码包准备 wget ...

随机推荐

  1. Java的封装继承和多态

    封装 定义:属性私有private:get/set 目的 提高程序的安全性,保护数据 隐藏代码的实现细节 统一接口 提高系统的可维护性 代码 public class Student { //名字 p ...

  2. Airbnb JavaScript代码规范(完整)

    类型Types 基本数据类型 string number boolean null undefined symbol const foo = 1; let bar = foo; bar = 9; co ...

  3. FreeBSD ports 多线程编译

    FreeBSD ports 多线程编译FORCE_MAKE_JOBS=yesMAKE_JOBS_NUMBER=4写入/etc/make.conf没有就新建.4是处理器核心数,不知道就别改.

  4. @WebFilter("")配置servlet访问出现404的原因

    配置 servlet 一共有两种方式 直接在web.xml中配置name 和 url-parttern 使用注解配置servlet 使用注解的方式配置servlet是在servlet3.0之后新增的特 ...

  5. 手把手教你DNS劫持挂马

    出品|MS08067实验室(www.ms08067.com) 本文作者:BlackCat(Ms08067内网安全小组成员) 首先学习DNS劫持之前,务必要了解下DNS是个什么玩意. DNS(域名系统) ...

  6. P3160 [CQOI2012]局部极小值 题解(状压DP+容斥)

    题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示 ...

  7. Codeforces Round #553 B. Dima and a Bad XOR

    题面: 传送门 题目描述: 题意很简单:在一个N*M的矩阵中(N行M列),问是否可以:每行选一个整数,使他们的异或和大于0.如果不可以,输出"NIE":如果可以,输出"T ...

  8. sort函数用于vector向量的排序

    参考资料: 关于C++中vector和set使用sort方法进行排序 作者注:这篇文章写得相当全面,包括对vector和set中不同数据类型(包括结构体)的排序,还有一些还没看懂--特作此摘录,供当前 ...

  9. python3 输出字符

    import string'''whitespace -- a string containing all ASCII whitespaceascii_lowercase -- a string co ...

  10. ApiTesting全链路接口自动化测试框架 - 实战应用

    场景一.添加公共配置 我们在做自动化开始的时候,一般有很多公共的环境配置,比如host.token.user等等,如果这些放在用例中,一旦修改,将非常的不便.麻烦(尤其切换环境). 所以这里我们提供了 ...