【教训】null == '',改造ThinkSNS 系统里面的一个缓存管理函数S()后,留下一个大bug
本来想简化 ThinkSNS 系统里面的一个缓存管理函数:
<?php
/**
* 用来对应用缓存信息的读、写、删除
* $expire = null/0 表示永久缓存,否则为缓存有效期
*/
function S($name, $value = '', $expire = null)
{
static $_cache = array(); //减少缓存读取
$cache = model('Cache');
//$name = C('DATA_CACHE_PREFIX').$name; if ('' !== $value)
{
if (is_null($value))
{
// 删除缓存
$result = $cache->rm($name);
if ($result)
{
unset($_cache[$name]);
} return $result;
}
else
{
// 缓存数据
$cache->set($name, $value, $expire);
$_cache[$name] = $value;
} return true;
} if (isset($_cache[$name]))
{
return $_cache[$name];
} // 获取缓存数据
$value = $cache->get($name);
$_cache[$name] = $value; return $value;
}
简化如下:
/**
* 内存缓存
*
* @param string $name 缓存键
* @param string $value 缓存值(为''时,表示获取; 为null表示删除)
* @param mixed $expire = null/0 表示永久缓存,否则为缓存有效期
*/
function S($name, $value = '', $expire = null)
{
$cache = model('Cache'); if ($value == '') // 获取缓存
{
return $cache->get($name);
}
elseif (is_null($value)) // 删除缓存
{
return $cache->rm($name);
}
else
{
return $cache->set($name, $value, $expire);
}
}
结果呢,留下了一个大bug,想通过 S('键名', null); 来删除某个缓存,死活不成功!
通过跟踪,原来 当 $value = null 时,if ($value == '') 匹配成功,弱类型转换,即 null == '',所以需要把“等号”改为“恒等号”。即,把 if ($value == '') 改为 if ($value === ''),问题解决。
/**
* 内存缓存
*
* @param string $name 缓存键
* @param string $value 缓存值(为''时,表示获取; 为null表示删除)
* @param mixed $expire = null/0 表示永久缓存,否则为缓存有效期
*/
function S($name, $value = '', $expire = null)
{
$cache = model('Cache'); if ($value === '') // 获取缓存
{
return $cache->get($name);
}
elseif (is_null($value)) // 删除缓存
{
return $cache->rm($name);
}
else
{
return $cache->set($name, $value, $expire);
}
}
【教训】null == '',改造ThinkSNS 系统里面的一个缓存管理函数S()后,留下一个大bug的更多相关文章
- 编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url
编写一个C语言函数,要求输入一个url,输出该url是首页.目录页或者其他url 首页.目录页或者其他url 如下形式叫做首页: militia.info/ www.apcnc.com.cn/ htt ...
- 封装一个Ajax工具函数
/*封装一个ajax工具函数*/ window.$ = {}; /*通过$定义一个ajax函数*/ /* * 1. type string 请求的方式 默认是get * 2. url ...
- [Winfrom] 使用一个启动快捷方式,打开2个不同的窗体并且共用一个缓存空间
之所以有这个功能,是不想再给后台和前台写一套通讯机制的情况下偷懒的办法! 之前发现在主函数里面写方法,第二次启动程序打开新窗体或是显示隐藏窗体!最后却发现在主函数里面打开的新窗体和原启动的程序并不是共 ...
- Entity Framework 6 Recipes 2nd Edition(11-4)译 -> 在”模型定义”函数里调用另一个”模型定义”函数
11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11 ...
- Node.js函数介绍(参数为一个函数)
在JavaScript中,一个函数可以作为另一个函数的参数.我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数. Node.js中函数的使用与Javascript类似,举例来说,你可 ...
- Js文件函数中调用另一个Js文件函数的方法
在项目中Js文件需要完成某一功能,但这一功能的大部分代码在另外一个Js文件已经完成,只需要调用这个文件实现功能.那么如何调用:一个Js文件函数中调用另一个Js文件函数的方法? (直接代码说明) 示例d ...
- Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统
理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...
- Java核心知识点 --- 线程中如何创建锁和使用锁 Lock , 设计一个缓存系统
理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...
- 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类
今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在W ...
随机推荐
- abp ef codefirst 设置默认值
public partial class tableIsWaringfiled : DbMigration { public override void Up() { //设置默认值为true Add ...
- ajax是可以本地运行的
ajax是可以本地运行的,经过验证,可以是可以,但跟浏览器有关,火狐和新IE可以,chrome不可以,旧ie不知道什么原因也不可以.但是浏览器也有它的安全策略,必须是同一目录下的文件可以访问.chro ...
- GYM - 101147 F.Bishops Alliance
题意: 一个n*n的棋盘,有m个主教.每个主教都有自己的权值p.给出一个值C,在棋盘中找到一个最大点集.这个点集中的点在同一条对角线上且对于点集中任意两点(i,j),i和j之间的主教数(包括i,j)不 ...
- 一文看懂Kafka消息格式的演变
摘要 对于一个成熟的消息中间件而言,消息格式不仅关系到功能维度的扩展,还牵涉到性能维度的优化.随着Kafka的迅猛发展,其消息格式也在不断的升级改进,从0.8.x版本开始到现在的1.1.x版本,Kaf ...
- http登陆时的密码加密
系统设计登陆页面的时候,需要谨慎.因为登陆数据是在网络上进行传输,很可能中途被拦截. 最好的登陆是使用https,这样网络传输是安全的.google,baidu,alibaba都使用https的方式. ...
- code forces 999C Alphabetic Removals
C. Alphabetic Removals time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Python之多线程:Threading模块
1.Threading模块提供的类 Thread,Lock,Rlock,Condition,Semaphore,Event,Timer,local 2.threading模块提供的常用的方法 (1)t ...
- DiskGenius
DiskGenius是一款集磁盘分区管理与数据恢复功能于一身的工具软件.它即是一款功能强大.灵活易用的分区软件,同时也是一款技术高超.功能全面的数据恢复软件.它不仅具备与分区管理有关的几乎全部功能,支 ...
- 网络嗅探器Wireshark
http://www.wireshark.org/ About Wireshark Wireshark is the world's foremost network protocol analy ...
- OpenGL入门学习(七)(转)
http://blog.chinaunix.net/uid-20622737-id-1912803.html 今天要讲的是OpenGL光照的基本知识.虽然内容显得有点多,但条理还算比较清晰,理解起来应 ...