php延时更新点击数[文件缓存]
星期三, 三月 9th, 2011想法来源
用户积分增加
列入 用户访问空间时增加1分
用户首次登陆增加10分
那么每次操作都要insert一次
这显然很浪费
如果可以缓存一次性写入那么就可以降低MYSQL的压力了
像上面的情况我只要一次性增加11分即可
在THINKPHP中找到了方法
下面代码转载自THINKPHP(advmodel.class.php)
setLazyInc($field,$condition='',$step=1,$lazyTime=0) { //缓存累加 if(empty($condition) && isset($this->options['where'])) $condition = $this->options['where']; if(empty($condition)) { // 没有条件不做任何更新 return false; } if($lazyTime>0) {// 延迟写入 $guid = md5($this->name.'_'.$field.'_'.serialize($condition)); $step = $this->lazyWrite($guid,$step,$lazyTime); if(false === $step ) return true; // 等待下次写入 } return $this->setField($field,array('exp',$field.'+'.$step),$condition); } function lazyWrite($guid,$step,$lazyTime) { if(false !== ($value = F($guid))) { // 存在缓存写入数据 if(time()>F($guid.'_time')+$lazyTime) { // 延时更新时间到了,删除缓存数据 并实际写入数据库 F($guid,NULL); F($guid.'_time',NULL); return $value+$step; }else{ // 追加数据到缓存 F($guid,$value+$step); return false; } }else{ // 没有缓存数据 F($guid,$step); // 计时开始 F($guid.'_time',time()); return false; } }
上面有个 FUNCTION F 在FACTIONS.PHP
// 快速文件数据读取和保存 针对简单类型数据 字符串、数组
function F($name,$value='',$path=DATA_PATH) { //修改$path为自己的缓存路径
static $_cache = array();
$filename = $path.$name.'.php';
if('' !== $value) {
if(is_null($value)) {
// 删除缓存
return unlink($filename);
}else{
// 缓存数据
$dir = dirname($filename);
// 目录不存在则创建
if(!is_dir($dir)) mkdir($dir);
return file_put_contents($filename,"<?php\nreturn ".var_export($value,true).";\n?>");
}
}调用方法
setLazyDec($field,$condition='',$step=1,$lazyTime=0) //根据需要 自己修改吧我加入了table 等多个 function lazyaddint($table,$field,$condition='',$num=1,$ltime=0) //调用方法 更具实际需要修改吧 lazyaddint('表明','字段名',"WHERE条件",增加数量,缓存时间);
此方法 会在缓存目录中创建2个临时文件
//07e8c1b06dbdc4f282bf7bf9311a1fce_time.php <?php return 1299602761; ?> //07e8c1b06dbdc4f282bf7bf9311a1fce.php <?php return 21; ?>
根据时间超过 设定的时间就写入数据库
此方法已经适用无问题
感觉方法不太好.. 期待MEMCACHED的方式
