缓存实现代码及详细注释,文件缓存封装实现代码

function delete($key) {
return apc_delete($key);
}

/**
* 清除缓存
*
* @return Cache_Apc
*/
public function clear() {
apc_clear_cache();
return $this;
}

如Nginx,SQUID,mod_proxy(apache2以上又分为mod_proxy和mod_cache)
NGINX的例子

复制代码 代码如下:

/**
* 清(删)除具有缓存
*
* @return Cache_Abstract
*/
abstract public function clear();

Php代码

}
?>

/**
* 保存缓存变量
*
* @param string $key
* @param mixed $value
* @return bool
*/
public function store($key, $value) {
return apc_store($this->_storageKey($key), $value);
}

<?php  
class CacheException extends Exception {}  
/** 
 * 缓存抽象类 
 */  
abstract class Cache_Abstract {  
    /** 
     * 读缓存变量 
     * 
     * @param string $key 缓存下标 
     * @return mixed 
     */  
    abstract public function fetch($key);  
      
    /** 
     * 缓存变量 
     * 
     * @param string $key 缓存变量下标 
     * @param string $value 缓存变量的值 
     * @return bool 
     */  
    abstract public function store($key, $value);  
      
    /** 
     * 删除缓存变量 
     * 
     * @param string $key 缓存下标 
     * @return Cache_Abstract 
     */  
    abstract public function delete($key);  
      
    /** 
     * 清(删)除具备缓存 
     * 
     * @return Cache_Abstract 
     */  
    abstract public function clear();  
      
    /** 
     * 锁定缓存变量 
     * 
     * @param string $key 缓存下标 
     * @return Cache_Abstract 
     */  
    abstract public function lock($key);  
  
    /** 
     * 缓存变量解锁 
     * 
     * @param string $key 缓存下标 
     * @return Cache_Abstract 
     */  
    abstract public function unlock($key);  
  
    /** 
     * 获得缓存变量是还是不是被锁定 
     * 
     * @param string $key 缓存下标 
     * @return bool 
     */  
    abstract public function isLocked($key);  
  
    /** 
     * 确定保证不是锁定状态 
     * 最多做$tries次睡眠等待解锁,超时则跳过并解锁 
     * 
     * @param string $key 缓存下标 
     */  
    public function checkLock($key) {  
        if (!$this->isLocked($key)) {  
            return $this;  
        }  
          
        $tries = 10;  
        $count = 0;  
        do {  
            usleep(200);  
            $count ++;  
        } while ($count <= $tries && $this->isLocked($key));  //
最多做12回睡眠等待解锁,超时则跳过并解锁  
  
        $this->isLocked($key) && $this->unlock($key);  
          
        return $this;  
    }  
}  
  
  
/** 
 * APC增加缓存达成 
 *  
 *  
 * @category   Mjie 
 * @package    Cache 
 * @author     流水正月 
 * @copyright  Copyright (c) 2008- <cmpan(at)qq.com> 
 * @license    New BSD License 
 * @version    $Id: Cache/Apc.php 版本号 2010-04-18 23:02 cmpan $ 
 */  
class Cache_Apc extends Cache_Abstract {  
      
    protected $_prefix = ‘cache.mjie.net’;  
      
    public function __construct() {  
        if (!function_exists(‘apc_cache_info’)) {  
            throw new CacheException(‘apc extension didn’t
installed’);  
        }  
    }  
      
    /** 
     * 保存缓存变量 
     * 
     * @param string $key 
     * @param mixed $value 
     * @return bool 
     */  
    public function store($key, $value) {  
        return apc_store($this->_storageKey($key), $value);  
    }  
      
    /** 
     * 读取缓存 
     * 
     * @param string $key 
     * @return mixed 
     */  
    public function fetch($key) {  
        return apc_fetch($this->_storageKey($key));  
    }  
      
    /** 
     * 清除缓存 
     * 
     * @return Cache_Apc 
     */  
    public function clear() {  
        apc_clear_cache();  
        return $this;  
    }  
      
    /** 
     * 删除缓存单元 
     * 
     * @return Cache_Apc 
     */  
    public function delete($key) {  
        apc_delete($this->_storageKey($key));  
        return $this;  
    }  
      
    /** 
     * 缓存单元是还是不是被锁定 
     * 
     * @param string $key 
     * @return bool 
     */  
    public function isLocked($key) {  
        if ((apc_fetch($this->_storageKey($key) . ‘.lock’)) ===
false) {  
            return false;  
        }  
          
        return true;  
    }  
      
    /** 
     * 锁定缓存单元 
     * 
     * @param string $key 
     * @return Cache_Apc 
     */  
    public function lock($key) {  
        apc_store($this->_storageKey($key) . ‘.lock’, ”, 5);  
        return $this;  
    }  
      
    /** 
     * 缓存单元解锁 
     * 
     * @param string $key 
     * @return Cache_Apc 
     */  
    public function unlock($key) {  
        apc_delete($this->_storageKey($key) . ‘.lock’);  
        return $this;  
    }  
      
    /** 
     * 完整缓存名 
     * 
     * @param string $key 
     * @return string 
     */  
    private function _storageKey($key) {  
        return $this->_prefix . ‘_’ . $key;  
    }  
}  
  
/** 
 * 文件缓存完毕 
 *  
 *  
 * @category   Mjie 
 * @package    Cache 
 * @author     流水三之日 
 * @copyright  Copyright (c) 2008- <cmpan(at)qq.com> 
 * @license    New BSD License 
 * @version    $Id: Cache/File.php 版本号 2010-04-18 16:46 cmpan $ 
 */  
class Cache_File extends Cache_Abstract {  
    public $useSubdir     = false;  
      
    protected $_cachesDir = ‘cache’;  
      
    public function __construct() {  
        if (defined(‘DATA_DIR’)) {  
            $this->_setCacheDir(DATA_DIR . ‘/cache’);  
        }  
    }  
      
    /** 
     * 获取缓存文件 
     * 
     * @param string $key 
     * @return string 
     */  
    protected function _getCacheFile($key) {  
        $subdir = $this->useSubdir ? substr($key, 0, 2) . ‘/’ :
”;  
        return $this->_cachesDir . ‘/’ . $subdir . $key .
‘.php’;  
    }  
  
    /** 
     * 读取缓存变量 
     * 为严防新闻外泄,缓存文件格式为php文件,并以”<?php
exit;?>”先河 
     *  
     * @param string $key 缓存下标 
     * @return mixed 
     */  
    public function fetch($key) {  
        $cacheFile = self::_getCacheFile($key);  
        if (file_exists($cacheFile) && is_readable($cacheFile)) {  
            // include 方式  
            //return include $cacheFile;  
            // 体系化格局  
  
            return unserialize(@file_get_contents($cacheFile, false,
NULL, 13));  
        }  
  
        return false;  
    }  
  
    /** 
     * 缓存变量 
     * 为幸免音讯外泄,缓存文件格式为php文件,并以”<?php
exit;?>”最早 
     * 
     * @param string $key 缓存变量下标 
     * @param string $value 缓存变量的值 
     * @return bool 
     */  
    public function store($key, $value) {  
        $cacheFile = self::_getCacheFile($key);  
        $cacheDir  = dirname($cacheFile);  
  
        if(!is_dir($cacheDir)) {  
            if(!@mkdir($cacheDir, 0755, true)) {  
                throw new CacheException(“Could not make cache
directory”);  
            }  
        }  
    // 用include方式  
        //return @file_put_contents($cacheFile, ‘<?php return ‘ .
var_export($value, true). ‘;’);  
  
        return @file_put_contents($cacheFile, ‘<?php exit;?>’ .
serialize($value));  
    }  
  
    /** 
     * 删除缓存变量 
     * 
     * @param string $key 缓存下标 
     * @return Cache_File 
     */  
    public function delete($key) {  
        if(emptyempty($key)) {  
            throw new CacheException(“Missing argument 1 for
Cache_File::delete()”);  
        }  
          
        $cacheFile = self::_getCacheFile($key);  
        if(!@unlink($cacheFile)) {  
            throw new CacheException(“Cache file could not be
deleted”);  
        }  
  
        return $this;  
    }  
  
    /** 
     * 缓存单元是不是早就锁定 
     * 
     * @param string $key 
     * @return bool 
     */  
    public function isLocked($key) {  
        $cacheFile = self::_getCacheFile($key);  
        clearstatcache();  
        return file_exists($cacheFile . ‘.lock’);  
    }  
  
    /** 
     * 锁定 
     * 
     * @param string $key 
     * @return Cache_File 
     */  
    public function lock($key) {  
        $cacheFile = self::_getCacheFile($key);  
        $cacheDir  = dirname($cacheFile);  
        if(!is_dir($cacheDir)) {  
            if(!@mkdir($cacheDir, 0755, true)) {  
                if(!is_dir($cacheDir)) {  
                    throw new CacheException(“Could not make cache
directory”);  
                }  
            }  
        }  
  
        // 设定缓存锁文件的拜候和修改时间  
        @touch($cacheFile . ‘.lock’);  
        return $this;  
    }  
    
    /** 
     * 解锁 
     * 
     * @param string $key 
     * @return Cache_File 
     */  
    public function unlock($key) {  
        $cacheFile = self::_getCacheFile($key);  
        @unlink($cacheFile . ‘.lock’);  
        return 

<?php

$this->_storage->checkLock($key);

用的最广的例子看Discuz的检索作用,把结果ID缓存到三个表中,下一次寻觅一样关键字时先找找缓存表。

function __construct() {
$this->connection = new MemCache;
}

/**
* 缓存单元是还是不是被锁定
*
* @param string $key
* @return bool
*/
public function isLocked($key) {
if ((apc_fetch($this->_storageKey($key) . ‘.lock’)) === false) {
return false;
}

依据反向代理的Web缓存:

abstract class Cache_Abstract {
abstract function fetch($key);
abstract function store($key, $data, $ttl);
abstract function delete($key);
}

/**
* APC扩大缓存实现
*
*
* @category Mjie
* @package Cache
* @author 流水一月
* @copyright Copyright (c) 2008- <cmpan(at)qq.com>
* @license New BSD License
* @version $Id: Cache/Apc.php 版本号 2010-04-18 23:02 cmpan $
*/
class Cache_Apc extends Cache_Abstract {

以上内容是代码级的设计方案,小编直接CP其余框架,也懒得改,内容都大约,很轻易就形成,何况会两种艺术共同用,但上面包车型客车剧情是服务器端的缓存方案,非代码级的,要有多方面包车型地铁协作才干不辱任务

function store($key, $data, $ttl) {
$h = fopen($this->getFileName($key), ‘a+’);
if (威尼斯手机娱乐官网 ,!$h)
throw new Exception(‘Could not write to cache’);
flock($h, LOCK_EX);
fseek($h, 0);
ftruncate($h, 0);
$data = serialize(array(time() + $ttl, $data));
if (fwrite($h, $data) === false) {
throw new Exception(‘Could not write to cache’);
}
fclose($h);
}

/**
* 设置缓存过期岁月(s)
*
* @param int $expire
*/
public function setExpire($expire) {
$this->_expire = (int) $expire;
return $this;
}
}

历次访谈页面包车型客车时候,都会先检验相应的缓存页面文件是还是不是留存,假设不真实,就三翻五次数据库,得到数码,展现页面并还要生成缓存页面文件,那样后一次拜见的时候页面文件就发挥效能了。(模板引擎和网络分布的一部分PHP缓存机制类平时有此成效)

class Cache_APC extends Cache_Abstract {

/**
* 删除缓存单元
*
* @return Cache_Apc
*/
public function delete($key) {
apc_delete($this->_storageKey($key));
return $this;
}

当插入数据或更新数据时,强制更新PHP缓存机制。

}

return false;
}
/**
* 读缓存,富含过期的和无效的,取得完整的储备结构
*
* @param string $key
*/
public function fetch($key) {
$this->_storage->checkLock($key);
$data = $this->_storage->fetch($key);
if ($data) {
$data[‘isExpired’] = (time() – $data[‘time’]) > $data[‘expire’]
? true : false;
return $data;
}

光阴接触缓存:

$cache = new Cache_缓存实现代码及详细注释,文件缓存封装实现代码。File();
$key = ‘getUsers:selectAll’;
// check if the data is not in the cache already
if (!$data = $cache->fetch($key)) {
// assuming there is a database connection
$result = mysql_query(“SELECT * FROM users”);
$data = array();
// fetching all the data and putting it in an array
while($row = mysql_fetch_assoc($result)) { $data[] = $row; }
// Storing the data in the cache for 10 minutes
$cache->store($key,$data,600);
}

复制代码 代码如下:

举个常用的主意,多表关联的时候,把附表中的内容生成数组保存到主表的四个字段中,必要的时候数组分解一下,那样的裨益是只读一个表,坏处正是三个数据同步会多相当的多步骤,数据库永久是瓶颈,用硬盘换速度,是以此的关键点。

下载: class_cache3.php

$cacheEntry .= ‘/’ . $entry;
if(is_file($cacheEntry)) {
@unlink($cacheEntry);
}
}
$d2->close();
}
}
$d->close();

有eaccelerator, apc,
phpa,xcache,这些那么些就背着了呢,寻觅一群一群的,自身看呀,知道有那玩意儿就OK

文件缓存

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

内容触发缓存: