php延时更新点击数[文件缓存]

2011年 09月 03日 00:56

想法来源

用户积分增加

列入 用户访问空间时增加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,"");
        }
    }

调用方法

setLazyDec($field,$condition='',$step=1,$lazyTime=0) 
//根据需要 自己修改吧我加入了table 等多个
function lazyaddint($table,$field,$condition='',$num=1,$ltime=0)
//调用方法 更具实际需要修改吧
lazyaddint('表明','字段名',"WHERE条件",增加数量,缓存时间);

此方法 会在缓存目录中创建2个临时文件

//07e8c1b06dbdc4f282bf7bf9311a1fce_time.php


//07e8c1b06dbdc4f282bf7bf9311a1fce.php

根据时间超过 设定的时间就写入数据库 此方法已经适用无问题 感觉方法不太好.. 期待MEMCACHED的方式

tags: