天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP 緩存實(shí)現(xiàn)代碼及詳細(xì)注釋

復(fù)制代碼 代碼如下:
class CacheException extends Exception {}
/**
* 緩存抽象類(lèi)
*/
abstract class Cache_Abstract {
/**
* 讀緩存變量
*
* @param string $key 緩存下標(biāo)
* @return mixed
*/
abstract public function fetch($key);

/**
* 緩存變量
*
* @param string $key 緩存變量下標(biāo)
* @param string $value 緩存變量的值
* @return bool
*/
abstract public function store($key, $value);

/**
* 刪除緩存變量
*
* @param string $key 緩存下標(biāo)
* @return Cache_Abstract
*/
abstract public function delete($key);

/**
* 清(刪)除所有緩存
*
* @return Cache_Abstract
*/
abstract public function clear();

/**
* 鎖定緩存變量
*
* @param string $key 緩存下標(biāo)
* @return Cache_Abstract
*/
abstract public function lock($key);
/**
* 緩存變量解鎖
*
* @param string $key 緩存下標(biāo)
* @return Cache_Abstract
*/
abstract public function unlock($key);
/**
* 取得緩存變量是否被鎖定
*
* @param string $key 緩存下標(biāo)
* @return bool
*/
abstract public function isLocked($key);
/**
* 確保不是鎖定狀態(tài)
* 最多做$tries次睡眠等待解鎖,超時(shí)則跳過(guò)并解鎖
*
* @param string $key 緩存下標(biāo)
*/
public function checkLock($key) {
if (!$this->isLocked($key)) {
return $this;
}

$tries = 10;
$count = 0;
do {
usleep(200);
$count ++;
} while ($count <= $tries && $this->isLocked($key)); // 最多做十次睡眠等待解鎖,超時(shí)則跳過(guò)并解鎖
$this->isLocked($key) && $this->unlock($key);

return $this;
}
}

/**
* APC擴(kuò)展緩存實(shí)現(xiàn)
*
*
* @category Mjie
* @package Cache
* @author 流水孟春
* @copyright Copyright (c) 2008- <cmpan(at)qq.com>
* @license New BSD License
* @version $Id: Cache/Apc.php 版本號(hào) 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;
}
}
/**
* 文件緩存實(shí)現(xiàn)
*
*
* @category Mjie
* @package Cache
* @author 流水孟春
* @copyright Copyright (c) 2008- <cmpan(at)qq.com>
* @license New BSD License
* @version $Id: Cache/File.php 版本號(hào) 2010-04-18 16:46 cmpan $
*/
class Cache_File extends Cache_Abstract {

protected $_cachesDir = 'cache';

public function __construct() {
if (defined('DATA_DIR')) {
$this->_setCacheDir(DATA_DIR . '/cache');
}
}

/**
* 獲取緩存文件
*
* @param string $key
* @return string
*/
protected function _getCacheFile($key) {
return $this->_cachesDir . '/' . substr($key, 0, 2) . '/' . $key . '.php';
}
/**
* 讀取緩存變量
* 為防止信息泄露,緩存文件格式為php文件,并以"<?php exit;?>"開(kāi)頭
*
* @param string $key 緩存下標(biāo)
* @return mixed
*/
public function fetch($key) {
$cacheFile = self::_getCacheFile($key);
if (file_exists($cacheFile) && is_readable($cacheFile)) {
return unserialize(@file_get_contents($cacheFile, false, NULL, 13));
}
return false;
}
/**
* 緩存變量
* 為防止信息泄露,緩存文件格式為php文件,并以"<?php exit;?>"開(kāi)頭
*
* @param string $key 緩存變量下標(biāo)
* @param string $value 緩存變量的值
* @return bool
*/
public function store($key, $value) {
$cacheFile = self::_getCacheFile($key);
$cacheDir = dirname($cacheFile);
if(!is_dir($cacheDir)) {
if(mkdir($cacheDir" target="_blank">!@mkdir($cacheDir, 0755, true)) {
throw new CacheException("Could not make cache directory");
}
}
return @file_put_contents($cacheFile, '<?php exit;?>' . serialize($value));
}
/**
* 刪除緩存變量
*
* @param string $key 緩存下標(biāo)
* @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($cacheFile" target="_blank">!@unlink($cacheFile)) {
throw new CacheException("Cache file could not be deleted");
}
return $this;
}
/**
* 緩存單元是否已經(jīng)鎖定
*
* @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" target="_blank">!@mkdir($cacheDir, 0755, true)) {
if(!is_dir($cacheDir)) {
throw new CacheException("Could not make cache directory");
}
}
}
// 設(shè)定緩存鎖文件的訪問(wèn)和修改時(shí)間
@touch($cacheFile . '.lock');
return $this;
}

/**
* 解鎖
*
* @param string $key
* @return Cache_File
*/
public function unlock($key) {
$cacheFile = self::_getCacheFile($key);
@unlink($cacheFile . '.lock');
return $this;
}
/**
* 設(shè)置文件緩存目錄
* @param string $dir
* @return Cache_File
*/
protected function _setCacheDir($dir) {
$this->_cachesDir = rtrim(str_replace('//', '/', trim($dir)), '/');
clearstatcache();
if(!is_dir($this->_cachesDir)) {
mkdir($this->_cachesDir, 0755, true);
}
//
return $this;
}

/**
* 清空所有緩存
*
* @return Cache_File
*/
public function clear() {
// 遍歷目錄清除緩存
$cacheDir = $this->_cachesDir;
$d = dir($cacheDir);
while(false !== ($entry = $d->read())) {
if('.' == $entry[0]) {
continue;
}

$cacheEntry = $cacheDir . '/' . $entry;
if(is_file($cacheEntry)) {
@unlink($cacheEntry);
} elseif(is_dir($cacheEntry)) {
// 緩存文件夾有兩級(jí)
$d2 = dir($cacheEntry);
while(false !== ($entry = $d2->read())) {
if('.' == $entry[0]) {
continue;
}

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

return $this;
}
}
/**
* 緩存單元的數(shù)據(jù)結(jié)構(gòu)
* array(
* 'time' => time(), // 緩存寫(xiě)入時(shí)的時(shí)間戳
* 'expire' => $expire, // 緩存過(guò)期時(shí)間
* 'valid' => true, // 緩存是否有效
* 'data' => $value // 緩存的值
* );
*/
final class Cache {
/**
* 緩存過(guò)期時(shí)間長(zhǎng)度(s)
*
* @var int
*/
private $_expire = 3600;
/**
* 緩存處理類(lèi)
*
* @var Cache_Abstract
*/
private $_storage = null;
/**
* @return Cache
*/
static public function createCache($cacheClass = 'Cache_File') {
return new self($cacheClass);
}
private function __construct($cacheClass) {
$this->_storage = new $cacheClass();
}
/**
* 設(shè)置緩存
*
* @param string $key
* @param mixed $value
* @param int $expire
*/
public function set($key, $value, $expire = false) {
if (!$expire) {
$expire = $this->_expire;
}

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

$data = array('time' => time(), 'expire' => $expire, 'valid' => true, 'data' => $value);
$this->_storage->lock($key);

try {
$this->_storage->store($key, $data);
$this->_storage->unlock($key);
} catch (CacheException $e) {
$this->_storage->unlock($key);
throw $e;
}
}
/**
* 讀取緩存
*
* @param string $key
* @return mixed
*/
public function get($key) {
$data = $this->fetch($key);
if ($data && $data['valid'] && !$data['isExpired']) {
return $data['data'];
}

return false;
}
/**
* 讀緩存,包括過(guò)期的和無(wú)效的,取得完整的存貯結(jié)構(gòu)
*
* @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;
}

return false;
}
/**
* 刪除緩存
*
* @param string $key
*/
public function delete($key) {
$this->_storage->checkLock($key)
->lock($key)
->delete($key)
->unlock($key);
}

public function clear() {
$this->_storage->clear();
}
/**
* 把緩存設(shè)為無(wú)效
*
* @param string $key
*/
public function setInvalidate($key) {
$this->_storage->checkLock($key)
->lock($key);
try {
$data = $this->_storage->fetch($key);
if ($data) {
$data['valid'] = false;
$this->_storage->store($key, $data);
}
$this->_storage->unlock($key);
} catch (CacheException $e) {
$this->_storage->unlock($key);
throw $e;
}
}

/**
* 設(shè)置緩存過(guò)期時(shí)間(s)
*
* @param int $expire
*/
public function setExpire($expire) {
$this->_expire = (int) $expire;
return $this;
}
}

php技術(shù)PHP 緩存實(shí)現(xiàn)代碼及詳細(xì)注釋,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美人与动牲交A精品 | 红尘影院手机在线观看 | 成人bt下载| 国产成人免费高清视频 | 久久性综合亚洲精品电影网 | 青青久久国产 | 黑兽在线观看高清在线播放樱花 | 极品网红液液酱粉嫩福利照子凌酱 | 久久综合色视频 | 免费在线观看一区 | 久久91精品久久久久久水蜜桃 | 草b是什么感觉 | 97午夜伦伦电影理论片 | 亚洲A片不卡无码久久尤物 亚洲a免费 | 免费果冻传媒在线完整观看 | 亚洲黄色高清视频 | 色爰情人网站 | 漂亮的保姆6在线观看中文 漂亮的保姆5电影免费观看完整版中文 | 亚洲这里只有精品 | 沙发上小泬12P | WWW污污污抽搐喷潮COM | 草莓AV福利网站导航 | 久久夜色精品国产亚州AV卜 | 在线中文高清资源免费观看 | 国产亚洲一区在线 | 99久久免热在线观看6 | 97色伦97色伦国产 | 久青草国产在线观看视频 | 日日做夜夜欢狠狠免费软件 | 甜性涩爱bt下载 | 日本美女色 | 成 人 网 站免费观看 | 娇妻被朋友玩得呻吟在线电影 | 日韩免费一级毛片 | 乡土女性网动态图解 | 男男h啪肉np文总受 男男h开荤粗肉h文1v1 | 日本久久久久久久做爰片日本 | 精彩国产萝视频在线 | 中文字幕乱码一区久久麻豆樱花 | 久久国产36精品色熟妇 | 亚洲免费福利在线视频 |