加载中…
个人资料
shalalal
shalalal
  • 博客等级:
  • 博客积分:0
  • 博客访问:33,500
  • 关注人气:13
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

我的php_apc缓存类(含例子)

(2011-04-09 09:56:28)
标签:

apc缓存

例子

it

分类: 电脑技术
最近为php的效率问题伤透了脑经,选来选去,最后决定用Alternative PHP Cache(APC),但直接使用的效果还是不理想,遂借鉴网上高手的做法,自己修改了一个现成的apc缓存类,用起来舒服多了,不敢独享:
=======================================
我的代码注释都被新浪博客给删除了,郁闷!
看来是时候另找新家了!
=======================================
首先说一下apc的配置
在php.ini中新增如下行:
extension=php_apc.dll
[apc]
apc.rfc1867 = On
apc.cache_by_default=On
apc.include_once_override = Off
apc.shm_segments = 1
apc.shm_size = 256M
apc.ttl = 64800
apc.user_ttl = 64800
apc.num_files_hint = 1024
apc.enable_cli = 1
apc.max_file_size=2M
apc.optimization=0
========================================
下面是我的php_apc缓存类:
<?php

class hy_apc {
    protected $_prefix = 'hy.cache';

        public function __construct() {
        if (!function_exists('apc_cache_info')) {
            throw new CacheException('apc extension didn\'t installed');
        }
    }

   
    public function store($key,$value,$over=true,$time=0) {
        $result=FALSE;
            if ($this->exists($key)){
                if($over){
                    if($this->isLocked($key))$this->checkLock($key);
                    $this->lock($key,1);
                    try {
                        $result=apc_store($this->_storageKey($key), $value, $time);
                        $this->unlock($key);
                    } catch (CacheException $e){
                        $this->unlock($key);
                        throw new Exception($e);
                    
                } else {
                    $result=TRUE;
                }
            } else {
                $result=apc_store($this->_storageKey($key), $value, $time);
            }
            return $result;
    }
   
   
    public function fetch($key) {
        return apc_fetch($this->_storageKey($key));
    }

   
    public function clear() {
        apc_clear_cache();
        return $this;
    }

   
    public function delete($key) {
        if($this->isLocked($key))$this->checkLock($key);
            $this->lock($key);
            apc_delete($this->_storageKey($key));
            $this->unlock($key);
        return $this;
    }

   
    public function isLocked($key) {
            return $this->exists($key. '.lock');
    }

   
    public function lock($key, $time=3) {
        apc_store($this->_storageKey($key) . '.lock', '', $time);
        return $this;
    }

   
    public function unlock($key) {
        apc_delete($this->_storageKey($key) . '.lock');
        return $this;
    }

   
    private function _storageKey($key) {
        return $this->_prefix . '_' . $key;
    }

       
        public function exists($key) {
            return (apc_fetch($this->_storageKey($key))) === false?FALSE:TRUE;
        }
       
       
        public function checkLock($key) {
            if (!$this->isLocked($key)) {
                    return $this;
            }
            $tries = 10;
            $count = 0;
            do {
                usleep(200);
                $count ++;
            } while ($count <= $tries && $this->isLocked($key));  // 最多做十次睡眠等待解锁,超时则跳过并解锁
            $this->isLocked($key) && $this->unlock($key);
            return $this;
        }
}
class CacheException extends Exception {}
?>

========================================
在贴出个例子:
<?php

function get_login_msg($login_unit_id) {
    $mycache=new hy_apc();
    return $mycache->fetch('odes_login_msg_unit_id_'.$login_unit_id);
}

function set_login_msg($login_msg) {
    if(!$login_msg['login_unit_id'])      return FALSE;
    $mycache=new hy_apc();
    return $mycache->store('odes_login_msg_unit_id_'.$login_msg['login_unit_id'], $login_msg, TRUE);
}
?>

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有