首頁 >後端開發 >php教程 >php中apc和檔案快取類別的實作程式碼

php中apc和檔案快取類別的實作程式碼

WBOY
WBOY原創
2016-07-25 08:57:16957瀏覽
  1. class CacheException extends Exception {}

  2. /**
  3. * 快取抽象類別
  4. */
  5. 抽象class Cache_tracts {
  6. /**
  7. * 讀取快取變數
  8. *
  9. * @param string $key 快取下標
  10. * @return mixed
  11. */
  12. 抽象公用函數fetch($key);
  13. /**

  14. * 快取變數
  15. *
  16. * @param string $key 快取變數下標
  17. * @param string $value 快取變數的值
  18. * @return bool
  19. */
  20. 抽象公用函數store( $key, $value);
  21. /**

  22. * 刪除快取變數
  23. *
  24. * @param string $key 快取下標
  25. * @return Cache_Abstract
  26. */
  27. 抽象公用函數delete($key);
  28. /**

  29. * 清(刪除)除所有快取
  30. *
  31. * @return Cache_Abstract
  32. */
  33. 抽象公用函數clear();
  34. /**

  35. * 鎖定快取變數
  36. *
  37. * @param string $key 快取下標
  38. * @return Cache_Abstract
  39. */
  40. 抽象公用函數lock ($key);
  41. /* *
  42. * 快取變數解鎖
  43. *
  44. * @param string $key 快取下標
  45. * @return Cache_Abstract
  46. */
  47. 抽象公用函數unlock($key);
  48. /**
  49. * 取得快取變數是否被鎖定
  50. *
  51. * @param string $key 快取下標
  52. * @return bool
  53. */
  54. 抽象公用函數isLocked($key) ;
  55. /**
  56. * 確保不是鎖定狀態
  57. * 最多做$tries次睡眠等待解鎖,超時則跳過並解鎖
  58. *
  59. * @param string $key 快取下標
  60. */
  61. public function checkLock($key) {
  62. if (!$this->isLocked($key)) {
  63. return $this;
  64. }
  65. $tries = 10;
  66. $count = 0;
  67. do {
  68. usleep(200);
  69. $count ++;
  70. } while ($count isLocked( $key)); // 最多做十次睡眠等待解鎖,超時則跳過並解鎖
  71. $this->isLocked($key) && $this->unlock($key);
  72. return $this ;
  73. }
  74. }
  75. /**

  76. * APC擴充快取實作
  77. *
  78. * @by bbs.it-home.org
  79. * @category Mjie
  80. * @package Cache
  81. * @category Mjie
  82. * @package Cache
  83. * @license New BSD License
  84. * @package Cache
  85. * @license New BSD License
  86. * @package Cache
  87. * @license New BSD License
  88. * @package Cache
  89. * @license New BSD License
  90. * @package Cache
  91. * @license New BSD License
  92. * @package Cache
  93. * @license New BSD License
  94. * @package Cache
  95. * @license New BSD >* @version $Id: Cache/Apc.php 版本號2010-04-18 23:02 cmpan $
  96. */
  97. class Cache_Apc extends Cache_Abstract {
  98. 受保護$_prefix = 'cache.mjie.net';

  99. public function __construct() {

  100. if (!function_exists('apc_cache_info')) {
  101. throw new Caches('apc_cache_info')) {
  102. throw new CacheException( '未未安裝apc 擴充功能');
  103. }
  104. }
  105. /**

  106. * 儲存快取變數
  107. *
  108. * @param string $key
  109. * @param mixed $value
  110. * @return bool
  111. */
  112. public function store($key, $value ) {
  113. return apc_store($this->_storageKey($key), $value);
  114. }
  115. /**

  116. * 讀取快取
  117. *
  118. * @param string $key
  119. * @return mixed
  120. */
  121. public function fetch($key) {
  122. return apc_fetch($this->_storageKey($key));
  123. }
  124. /**

  125. * 清除快取
  126. *
  127. * @return Cache_Apc
  128. */
  129. public functionclear() {
  130. apc_clear_cachec_clear_cachec_clear_cache ();
  131. return $this;
  132. }
  133. /**

  134. * 刪除快取單元
  135. *
  136. * @return Cache_Apc
  137. */
  138. public function delete($key) {
  139. apc_delete($this ->_storageKey($key));
  140. return $this;
  141. }
  142. /* *

  143. * 快取單元是否被鎖定
  144. *
  145. * @param string $key
  146. * @return bool
  147. */
  148. public function isLocked($key) {
  149. if ((apc_fetch($this->_storageKey($key) . '.lock')) === false) {
  150. 回傳false;
  151. }
  152. 回傳true;
  153. }
  154. /**

  155. * 鎖定快取單元
  156. *
  157. * @param string $key
  158. * @return Cache_Apc
  159. */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;}

  160. /**

  161. * 完整快取名稱
  162. *
  163. * @param string $key
  164. * @return string
  165. */
  166. 原生函數_storageKey($key) {
  167. 回傳$this->_prefix 。 }
  168. }
  169. /**
  170. * 檔案快取實作
  171. *
  172. * @by bbs.it-home.org
  173. * @category Mjie
  174. * @package Cache
  175. * @license New BSD License
  176. * @version $Id: Cache/File.php 版本號2010-04-18 16:46 cmpan $
  177. */
  178. class Cache_File extends Cache_Abstract {
  179. protected $_cachesDir = 'cache';

  180. public function __construct() {

  181. if (define('DATA_DIR')) {
  182. $this->_setCacheDir(DATA_DIR . '/cache');
  183. }
  184. }
  185. /**

  186. * 取得快取檔案
  187. *
  188. * @param string $key
  189. * @return string
  190. */
  191. 受保護函數_getCacheFile($key) {
  192. 回傳$this->_cachesDir 。 ( $key, 0, 2) 。 $ cacheFile = self::_getCacheFile($key);
  193. if (file_exists($cacheFile) && is_read($cacheFile)) {
  194. return unserialize(@file_get_contents($cacheFile, false, NULL, 13));
  195. }
  196. return false;
  197. }
  198. /**
  199. * 讀取快取變數
  200. * 為防止資訊洩露,快取文件格式為php文件,並以""開頭
  201. *
  202. * @param string $key 緩存下標
  203. * @return mixed
  204. */
  205. public function store($key, $value) {
  206. $cacheFile = self::_getCacheFile( $ key);
  207. $cacheDir = dirname($cacheFile);
  208. if(!is_dir($cacheDir)) {
  209. if([url=mailto:!@mkdir($cacheDir]!@mkdir($cacheDir[/url], 0755, true)) {
  210. throw new CacheException("無法創建緩存目錄");
  211. }
  212. }
  213. return @file_put_contents($cacheFile, '' .serialize($value)); }
  214. /**
  215. * 快取變數
  216. * 為防止資訊洩露,快取文件格式為php文件,並以""開頭
  217. *
  218. * @param string $key 快取變數下標
  219. * @param string $value 快取變數的值
  220. * @return bool
  221. */
  222. public function delete($key) {
  223. if(empty($key)) {
  224. throw new CacheException(" 缺少參數1 for Cache_File:: delete() ");
  225. }
  226. $cacheFile = self::_getCacheFile($key);
  227. if([url=mailto:!@unlink($cacheFile]!@ unlink($ cacheFile[/ url])) {
  228. throw new CacheException("快取檔案無法刪除");
  229. }
  230. return $this;
  231. }
  232. /**
  233. * 刪除快取變數
  234. *
  235. * @param string $key 快取下標
  236. * @return Cache_File
  237. */
  238. public function isLocked($key) {
  239. $cacheFile = self::_getCacheFile($key);
  240. clearstatcache();
  241. return file_exists($cacheFile . '.lock');
  242. >/**
  243. * 快取單元是否已鎖定
  244. *
  245. * @param string $key
  246. * @return bool
  247. */
  248. public function lock($key) {
  249. $cacheFile = self::_getCacheFile($key);
  250. $cacheDir = 目錄名稱($cacheFile) ;
  251. if(!is_dir($cacheDir)) {
  252. if([url=mailto:!@mkdir($cacheDir]!@mkdir($cacheDir[/url], 0755, true)) {
  253. if( !is_dir($cacheDir)) {
  254. throw new CacheException("無法建立快取目錄");
  255. }
  256. }
  257. }
  258. // 設定快取鎖定檔案的存取和修改時間
  259. @touch($cacheFile . '.lock');
  260. return $this;
  261. }
  262. /**
  263. * 鎖定
  264. *
  265. * @param string $key
  266. * @return Cache_File
  267. */
  268. 公用函數unlock($key) {
  269. $cacheFile = self: :_getCacheFile($key);
  270. @unlink($cacheFile . '.lock');
  271. return $this;
  272. }
  273. /**
  274. * 解鎖
  275. *
  276. * @param string $key
  277. * @return Cache_File
  278. */
  279. 受保護函數_setCacheDir($dir) {
  280. $this->_cachesDir = rtrim(str_replace('\', '/', trimrim ( $dir)), '/');
  281. clearstatcache();
  282. if(!is_dir($this->_cachesDir)) {
  283. mkdir($this->_cachesDir, 0755, true) ;
  284. }
  285. //
  286. return $this;
  287. }
  288. /**
  289. * 設定檔案快取目錄
  290. * @param string $dir
  291. * @return Cache_File
  292. */
  293. public functionclear() {
  294. // 提交目錄清除儲存
  295. $cacheDir = $this->_cachesDir;
  296. $d = dir($cacheDir);
  297. while(false !== ($entry = $d->read()) ) {
  298. if('.' == $entry[0]) {
  299. 繼續;
  300. }
  301. $cacheEntry = $cacheDir 。 '/' 。 $entry;
  302. if(is_file($cacheEntry)) {
  303. @unlink($cacheEntry);
  304. } elseif(is_dir($cacheEntry)) {
  305. // 儲存資料夾有兩級
  306. $d2 = dir($cacheEntry);
  307. while(false !== ($entry = $d2->read())) {
  308. if('.' == $entry[0] ) {
  309. 繼續;
  310. }
  311. $cacheEntry .= '/' 。 $entry;
  312. if(is_file($cacheEntry)) {
  313. @unlink($cacheEntry);
  314. }
  315. }
  316. $d2->close();
  317. }
  318. }
  319. }
  320. $d->close();
  321. return $this;
  322. }
  323. }
  324. /**
  325. * 快取單元的資料結構
  326. * array(
  327. * 'time' => time(), // 快取寫入時的時間戳記
  328. * 'expire' => $expire, / / 快取過期時間
  329. * 'valid' => true, // 快取是否有效
  330. * 'data' => $value // 快取的值
  331. * );
  332. */
  333. 最終類別快取{
  334. /**
  335. * 快取過期時間長度(s)
  336. *
  337. * @var int
  338. */
  339. 私有$_expire = 3600;
  340. /**
  341. * 快取處理類別
  342. *
  343. * @var Cache_Abstract
  344. */
  345. 私有$_storage = null;
  346. /**
  347. * @return 快取
  348. *//
  349. static public function createCache($cacheClass = 'Cache_File') {
  350. return new self($cacheClass);
  351. }
  352. private function __construct($cacheClass) {
  353. * 設定快取
  354. *
  355. * @param string $key
  356. * @param mixed $value
  357. * @param int $expire
  358. $ = new $cacheClass();
  359. }
  360. /**
  361. * 讀取快取
  362. *
  363. * @param string $key
  364. * @return mixed
  365. */
  366. public function set($key, $value, $expire = false) {
  367. if (! $expire) {
  368. $expire = $this->_expire;
  369. }
  370. $this->_storage->checkLock($key);
  371. $data = array('time' => time(), 'expire' => $expire, 'valid' => true, 'data' => $value);
  372. $this->_storage- >lock($key);
  373. 嘗試{
  374. $this->_storage->store($key, $data);
  375. $this->_storage->unlock ($key);
  376. } catch (CacheException $e) {
  377. $this->_storage->unlock($key);
  378. throw $e;
  379. }
  380. }
  381. /**
  382. * 讀取緩存,包括過期的和無效的,取得完整的存貯結構
  383. *
  384. * @param string $key
  385. */
  386. public function get($ key) {
  387. $data = $this->fetch($key);
  388. if ($data && $data[' valid'] && !$data['isExpired']) {
  389. return $ data['data'];
  390. }
  391. return false;
  392. }
  393. /**
  394. * 刪除快取
  395. *
  396. * @param string $key
  397. */
  398. public function fetch($key) {
  399. $ this->_storage->checkLock($key);
  400. $data = $this->_storage->fetch( $key);
  401. if ($data) {
  402. $data['isExpired'] = (time() - $data['time']) >; $data['過期'] ? true : false;
  403. return $data;
  404. }
  405. return false;
  406. }
  407. /**
  408. * 把快取設為無效
  409. *
  410. * @param string $key
  411. */
  412. public function delete($key) {
  413. $this->_storage->checkLock($key)
  414. ->lock($key)
  415. ->delete($key)
  416. ->unlock($key) ;
  417. }
  418. 公用函數clear() {

  419. $this->_storage-> clear();
  420. }
  421. /**
  422. * 設定快取過期時間(s)
  423. *
  424. * @param int $expire
  425. */
  426. public function setInvalidate($key) {
  427. $this->_storage->checkLock($key)
  428. -> lock($key);
  429. 嘗試{
  430. $data = $this->_storage->fetch($key);
  431. if ($data) {
  432. $data['valid'] = false;
  433. $this->; _storage->store($key, $data);
  434. }
  435. $this->_storage->unlock($key);
  436. } catch (CacheException $ e) {
  437. $ this->_storage->unlock($key);
  438. throw $e;
  439. }
  440. }
  441. /** */

  442. public function setExpire($expire) {
  443. $this->_expire = (int) $expire;
  444. return $this;
  445. }
  446. }
  447. ?> p>
複製程式碼


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn