-
-
class CacheException extends Exception {}
- /**
- * 快取抽象類別
- */
- 抽象class Cache_tracts {
- /**
- * 讀取快取變數
- *
- * @param string $key 快取下標
- * @return mixed
- */
- 抽象公用函數fetch($key);
/**
- * 快取變數
- *
- * @param string $key 快取變數下標
- * @param string $value 快取變數的值
- * @return bool
- */
- 抽象公用函數store( $key, $value);
/**
- * 刪除快取變數
- *
- * @param string $key 快取下標
- * @return Cache_Abstract
- */
- 抽象公用函數delete($key);
/**
- * 清(刪除)除所有快取
- *
- * @return Cache_Abstract
- */
- 抽象公用函數clear();
/**
- * 鎖定快取變數
- *
- * @param string $key 快取下標
- * @return Cache_Abstract
- */
- 抽象公用函數lock ($key);
- /* *
- * 快取變數解鎖
- *
- * @param string $key 快取下標
- * @return Cache_Abstract
- */
- 抽象公用函數unlock($key);
- /**
- * 取得快取變數是否被鎖定
- *
- * @param string $key 快取下標
- * @return bool
- */
- 抽象公用函數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 isLocked( $key)); // 最多做十次睡眠等待解鎖,超時則跳過並解鎖
- $this->isLocked($key) && $this->unlock($key);
-
- return $this ;
- }
- }
/**
- * APC擴充快取實作
- *
- * @by bbs.it-home.org
- * @category Mjie
- * @package Cache
- * @category Mjie
- * @package Cache
- * @license New BSD License
- * @package Cache
- * @license New BSD License
- * @package Cache
- * @license New BSD License
- * @package Cache
- * @license New BSD License
- * @package Cache
- * @license New BSD License
- * @package Cache
- * @license New BSD License
- * @package Cache
- * @license New BSD >* @version $Id: Cache/Apc.php 版本號2010-04-18 23:02 cmpan $
- */
- class Cache_Apc extends Cache_Abstract {
受保護$_prefix = 'cache.mjie.net';
public function __construct() {
- if (!function_exists('apc_cache_info')) {
- throw new Caches('apc_cache_info')) {
- throw new CacheException( '未未安裝apc 擴充功能');
- }
- }
/**
- * 儲存快取變數
- *
- * @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 functionclear() {
- apc_clear_cachec_clear_cachec_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) {
- 回傳false;
- }
-
- 回傳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*/公用函數解鎖($key) { apc_delete($this->_storageKey($key) .'.lock'); 回傳$this;}
/**
- * 完整快取名稱
- *
- * @param string $key
- * @return string
- */
- 原生函數_storageKey($key) {
- 回傳$this->_prefix 。 }
- }
- /**
- * 檔案快取實作
- *
- * @by bbs.it-home.org
- * @category Mjie
- * @package Cache
- * @license New BSD License
- * @version $Id: Cache/File.php 版本號2010-04-18 16:46 cmpan $
- */
- class Cache_File extends Cache_Abstract {
protected $_cachesDir = 'cache';
public function __construct() {
- if (define('DATA_DIR')) {
- $this->_setCacheDir(DATA_DIR . '/cache');
- }
- }
/**
- * 取得快取檔案
- *
- * @param string $key
- * @return string
- */
- 受保護函數_getCacheFile($key) {
- 回傳$this->_cachesDir 。 ( $key, 0, 2) 。 $ cacheFile = self::_getCacheFile($key);
- if (file_exists($cacheFile) && is_read($cacheFile)) {
- return unserialize(@file_get_contents($cacheFile, false, NULL, 13));
- }
- return false;
- }
- /**
- * 讀取快取變數
- * 為防止資訊洩露,快取文件格式為php文件,並以""開頭
- *
- * @param string $key 緩存下標
- * @return mixed
- */
- public function store($key, $value) {
- $cacheFile = self::_getCacheFile( $ key);
- $cacheDir = dirname($cacheFile);
- if(!is_dir($cacheDir)) {
- if([url=mailto:!@mkdir($cacheDir]!@mkdir($cacheDir[/url], 0755, true)) {
- throw new CacheException("無法創建緩存目錄");
- }
- }
- return @file_put_contents($cacheFile, '' .serialize($value)); }
- /**
- * 快取變數
- * 為防止資訊洩露,快取文件格式為php文件,並以""開頭
- *
- * @param string $key 快取變數下標
- * @param string $value 快取變數的值
- * @return bool
- */
- public function delete($key) {
- if(empty($key)) {
- throw new CacheException(" 缺少參數1 for Cache_File:: delete() ");
- }
-
- $cacheFile = self::_getCacheFile($key);
- if([url=mailto:!@unlink($cacheFile]!@ unlink($ cacheFile[/ url])) {
- throw new CacheException("快取檔案無法刪除");
- }
- return $this;
- }
- /**
- * 刪除快取變數
- *
- * @param string $key 快取下標
- * @return Cache_File
- */
- public function isLocked($key) {
- $cacheFile = self::_getCacheFile($key);
- clearstatcache();
- return file_exists($cacheFile . '.lock');
- >/**
- * 快取單元是否已鎖定
- *
- * @param string $key
- * @return bool
- */
- public function lock($key) {
- $cacheFile = self::_getCacheFile($key);
- $cacheDir = 目錄名稱($cacheFile) ;
- if(!is_dir($cacheDir)) {
- if([url=mailto:!@mkdir($cacheDir]!@mkdir($cacheDir[/url], 0755, true)) {
- if( !is_dir($cacheDir)) {
- throw new CacheException("無法建立快取目錄");
- }
- }
- }
- // 設定快取鎖定檔案的存取和修改時間
- @touch($cacheFile . '.lock');
- return $this;
- }
-
- /**
- * 鎖定
- *
- * @param string $key
- * @return Cache_File
- */
- 公用函數unlock($key) {
- $cacheFile = self: :_getCacheFile($key);
- @unlink($cacheFile . '.lock');
- return $this;
- }
- /**
- * 解鎖
- *
- * @param string $key
- * @return Cache_File
- */
- 受保護函數_setCacheDir($dir) {
- $this->_cachesDir = rtrim(str_replace('\', '/', trimrim ( $dir)), '/');
- clearstatcache();
- if(!is_dir($this->_cachesDir)) {
- mkdir($this->_cachesDir, 0755, true) ;
- }
- //
- return $this;
- }
-
- /**
- * 設定檔案快取目錄
- * @param string $dir
- * @return Cache_File
- */
- public functionclear() {
- // 提交目錄清除儲存
- $cacheDir = $this->_cachesDir;
- $d = dir($cacheDir);
- while(false !== ($entry = $d->read()) ) {
- if('.' == $entry[0]) {
- 繼續;
- }
-
- $cacheEntry = $cacheDir 。 '/' 。 $entry;
- if(is_file($cacheEntry)) {
- @unlink($cacheEntry);
- } elseif(is_dir($cacheEntry)) {
- // 儲存資料夾有兩級
- $d2 = dir($cacheEntry);
- while(false !== ($entry = $d2->read())) {
- if('.' == $entry[0] ) {
- 繼續;
- }
-
- $cacheEntry .= '/' 。 $entry;
- if(is_file($cacheEntry)) {
- @unlink($cacheEntry);
- }
- }
- $d2->close();
- }
- }
- }
- $d->close();
-
- return $this;
- }
- }
- /**
- * 快取單元的資料結構
- * array(
- * 'time' => time(), // 快取寫入時的時間戳記
- * 'expire' => $expire, / / 快取過期時間
- * 'valid' => true, // 快取是否有效
- * 'data' => $value // 快取的值
- * );
- */
- 最終類別快取{
- /**
- * 快取過期時間長度(s)
- *
- * @var int
- */
- 私有$_expire = 3600;
- /**
- * 快取處理類別
- *
- * @var Cache_Abstract
- */
- 私有$_storage = null;
- /**
- * @return 快取
- *//
- static public function createCache($cacheClass = 'Cache_File') {
- return new self($cacheClass);
- }
- private function __construct($cacheClass) {
- * 設定快取
- *
- * @param string $key
- * @param mixed $value
- * @param int $expire
- $ = new $cacheClass();
- }
- /**
- * 讀取快取
- *
- * @param string $key
- * @return mixed
- */
- 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);
-
- 嘗試{
- $this->_storage->store($key, $data);
- $this->_storage->unlock ($key);
- } catch (CacheException $e) {
- $this->_storage->unlock($key);
- throw $e;
- }
- }
- /**
- * 讀取緩存,包括過期的和無效的,取得完整的存貯結構
- *
- * @param string $key
- */
- public function get($ key) {
- $data = $this->fetch($key);
- if ($data && $data[' valid'] && !$data['isExpired']) {
- return $ data['data'];
- }
-
- 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['過期'] ? true : false;
- return $data;
- }
-
- return false;
- }
- /**
- * 把快取設為無效
- *
- * @param string $key
- */
- public function delete($key) {
- $this->_storage->checkLock($key)
- ->lock($key)
- ->delete($key)
- ->unlock($key) ;
- }
公用函數clear() {
- $this->_storage-> clear();
- }
- /**
- * 設定快取過期時間(s)
- *
- * @param int $expire
- */
- public function setInvalidate($key) {
- $this->_storage->checkLock($key)
- -> lock($key);
- 嘗試{
- $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;
- }
- }
/** */
- public function setExpire($expire) {
- $this->_expire = (int) $expire;
- return $this;
- }
- }
- ?> p>
-
複製程式碼
|