ホームページ  >  記事  >  バックエンド開発  >  PHPでのapcおよびファイルキャッシュクラスの実装コード

PHPでのapcおよびファイルキャッシュクラスの実装コード

WBOY
WBOYオリジナル
2016-07-25 08:57:16931ブラウズ
  1. class CacheException extends Exception {}

  2. /**
  3. * キャッシュ抽象クラス
  4. */
  5. abstract class Cache_Abstract {
  6. /**
  7. * キャッシュ変数の読み取り
  8. *
  9. * @param string $key キャッシュのサブスクリプト
  10. * @returnmixed
  11. */
  12. abstract public function fetch( $key);

  13. /**

  14. * キャッシュ変数
  15. *
  16. * @param string $key キャッシュ変数の添字
  17. * @param string $value キャッシュ変数の値
  18. * @return bool
  19. */
  20. 抽象パブリック関数ストア($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 queue subscript
  52. * @return bool
  53. */
  54. 抽象パブリック関数 isLocked ($key);
  55. /**
  56. * ロックされていないことを確認してください
  57. * ロック解除を待つために最大 $tries 回スリープし、タイムアウトが発生した場合はスキップしてロックを解除します
  58. *
  59. * @param string $key cache subscript
  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. }< ;/p>
  75. /**

  76. * APC 拡張キャッシュ実装
  77. *
  78. * @by bbs.it-home.org
  79. * @category Mjie
  80. * @package Cache
  81. * @license New BSD License
  82. * @version $Id: Cache/Apc.php バージョン番号2010-04-18 23:02 cmpan $
  83. */
  84. class Cache_Apc extends Cache_Abstract {

  85. protected $_prefix = 'cache.mjie.net';

  86. public function __construct() {

  87. if (!function_exists('apc_cache_info')) {
  88. throw new CacheException('apc 拡張機能がインストールされていません');
  89. }
  90. }

  91. < p>/**
  92. * キャッシュ変数を保存
  93. *
  94. * @param string $key
  95. * @parammixed $value
  96. * @return bool
  97. */
  98. public function store($key, $value) {
  99. return apc_store($this->_storageKey($key), $value);
  100. }

  101. < ;p>/**
  102. * 読み取りキャッシュ
  103. *
  104. * @param string $key
  105. * @returnmixed
  106. */
  107. public function fetch($key) {
  108. return apc_fetch($this->_storageKey($key));
  109. }

  110. /* *

  111. * キャッシュをクリアします
  112. *
  113. * @return Cache_Apc
  114. */
  115. public function clear() {
  116. apc_clear_cache();
  117. return $this;
  118. }

    gt;
  119. /**

  120. * キャッシュユニットを削除します
  121. *
  122. * @return Cache_Apc
  123. */
  124. public function delete($key ) {
  125. apc_delete($this->_storageKey($key));
  126. return $this;
  127. }

  128. /**

  129. * キャッシュユニットがロックされているかどうか
  130. *
  131. * @param string $key
  132. * @return bool
  133. */
  134. public function isLocked($key) {
  135. if ((apc_fetch($this->_storageKey($key) . '.lock')) === false) {
  136. return false;
  137. }
  138. return true;
  139. }

  140. /**

  141. * キャッシュユニットをロック
  142. *
  143. * @param string $key
  144. * @return Cache_Apc
  145. */
  146. public function lock($key) ) {
  147. apc_store($this->_storageKey($key) . '.lock', '', 5);
  148. return $this;
  149. }

  150. /**

  151. * キャッシュユニットのロック解除
  152. *
  153. * @param string $key
  154. * @return Cache_Apc
  155. */
  156. パブリック関数unlock($key) {
  157. apc_delete($this->_storageKey($key) . '.lock');
  158. return $this;
  159. }

  160. /**

  161. *完全なキャッシュ名
  162. *
  163. * @param string $key
  164. * @return string
  165. */
  166. プライベート関数 _storageKey($key) {
  167. return $this->_prefix . '_' 。 $key;
  168. }
  169. }
  170. /**
  171. * ファイルキャッシュ実装
  172. *
  173. * @by bbs.it-home.org
  174. * @category Mjie
  175. * @package Cache
  176. * @license 新しい BSD ライセンス
  177. * @version $Id: Cache/File.php バージョン番号 2010 -04-18 16:46 cmpan $
  178. */
  179. class Cache_File extends Cache_Abstract {

  180. protected $_cachesDir = 'cache';

  181. public function __construct() {

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

  186. /**

  187. * キャッシュファイルを取得します
  188. *
  189. * @param string $key
  190. * @return string
  191. */
  192. protected function _getCacheFile($key) {
  193. return $this->_cachesDir . '/' 。 substr($key, 0, 2) 。 '/' 。 $key 。 '.php';
  194. }
  195. /**
  196. * キャッシュ変数を読み取ります
  197. * 情報漏洩を防ぐため、キャッシュファイルの形式は「」で始まるphpファイルです
  198. *
  199. * @param string $key queue subscript
  200. * @returnmixed
  201. */
  202. public function fetch($key) {
  203. $cacheFile = self::_getCacheFile($key);
  204. if (file_exists($cacheFile) && is_readable($) acheFile)) {
  205. return unserialize(@file_get_contents($cacheFile, false, NULL, 13));
  206. }
  207. return false;
  208. }
  209. /**
  210. * キャッシュ変数
  211. * 情報漏洩を防ぐため、キャッシュファイルの形式は「」で始まるphpファイルです
  212. *
  213. * @param string $key キャッシュ変数の添字
  214. * @param string $value キャッシュ変数の値
  215. * @return bool
  216. */
  217. public function store($key, $value) {
  218. $cacheFile = self::_getCacheFile($key);
  219. $cacheDir = dirname($cacheFile);
  220. if(!is_dir($cacheDir)) {
  221. if([url=mailto:!@mkdir($cacheDir)] !@mkdir($cacheDir[/url], 0755, true)) {
  222. throw new CacheException("キャッシュ ディレクトリを作成できませんでした");
  223. }
  224. }
  225. return @file_put_contents($cacheFile, '' .serialize($value));
  226. }
  227. /**
  228. * キャッシュ変数を削除します
  229. *
  230. * @param string $key キャッシュの添字
  231. * @return Cache_File
  232. */
  233. public function delete($key) {
  234. if(empty($key)) {
  235. throw new CacheException("引数がありません) 1 for Cache_File::delete()");
  236. }
  237. $cacheFile = self::_getCacheFile($key);
  238. if([url=mailto:!@unlink($cacheFile]!@unlink($cacheFile[/ url])) {
  239. throw new CacheException("キャッシュ ファイルを削除できませんでした");
  240. }
  241. return $this;
  242. }
  243. /**
  244. * キャッシュユニットがロックされているかどうか
  245. *
  246. * @param string $key
  247. * @return bool
  248. */
  249. public function isLocked($key) {
  250. $cacheFile = self::_getCacheFile($key);
  251. clearstatcache();
  252. return file_exists($cacheFile . '.lock');
  253. }
  254. /**
  255. * ロック
  256. *
  257. * @param string $key
  258. * @return Cache_File
  259. */
  260. public function lock($key) {
  261. $cacheFile = self::_getCacheFile($key);
  262. $cacheDir = dirname($cacheFile);
  263. if(!is_dir($cacheDir)) {
  264. if([url=mailto:!@mkdir($cacheDir])!@mkdir($cacheDir[/url], 0755, true)) {
  265. if(!is_dir($cacheDir) )) {
  266. throw new CacheException("キャッシュ ディレクトリを作成できませんでした");
  267. }
  268. }
  269. }
  270. // 保存ファイルの保存と修正時間
  271. @touch($cacheFile . '.lock');
  272. return $this;
  273. }
  274. /**
  275. * ロック解除
  276. *
  277. * @param string $key
  278. * @return Cache_File
  279. */
  280. public functionunlock($key) {
  281. $cacheFile = self::_getCacheFile($key);
  282. @unlink($cacheFile . '.lock') ;
  283. return $this;
  284. }
  285. /**
  286. * ファイルキャッシュディレクトリを設定します
  287. * @param string $dir
  288. * @return Cache_File
  289. */
  290. 保護関数 _setCacheDir($dir) {
  291. $this->_cachesDir = rtrim(str_replace('\', '/', トリム($dir) )), '/');
  292. clearstatcache();
  293. if(!is_dir($this->_cachesDir)) {
  294. mkdir($this->_cachesDir, 0755, true);
  295. }
  296. //
  297. return $this;
  298. }
  299. /**
  300. * すべてのキャッシュをクリアします
  301. *
  302. * @return Cache_File
  303. */
  304. public function clear() {
  305. //遍历目录清除缓存
  306. $cacheDir = $this->_cachesDir;
  307. $d = dir($cacheDir);
  308. while(false !== ($entry = $d->read())) {
  309. if('.' == $entry[0]) {
  310. continue;
  311. }
  312. $cacheEntry = $cacheDir 。 '/' 。 $entry;
  313. if(is_file($cacheEntry)) {
  314. @unlink($cacheEntry);
  315. } elseif(is_dir($cacheEntry)) {
  316. // 保存文件夹有两级
  317. $d2 = dir($cacheEntry) ;
  318. while(false !== ($entry = $d2->read())) {
  319. if('.' == $entry[0]) {
  320. continue;
  321. }
  322. $cacheEntry .= ' /' 。 $entry;
  323. if(is_file($cacheEntry)) {
  324. @unlink($cacheEntry);
  325. }
  326. }
  327. $d2->gt;close();
  328. }
  329. }
  330. $d->close();
  331. return $this;
  332. }
  333. }
  334. /**
  335. * キャッシュユニットのデータ構造
  336. * array(
  337. * 'time' => time(), // キャッシュ書き込み時のタイムスタンプ
  338. * 'expire' => $expire, // キャッシュの有効期限
  339. * 'valid ' => true, // キャッシュが有効かどうか
  340. * 'data' => $value // キャッシュされた値
  341. * );
  342. */
  343. final クラス キャッシュ {
  344. /**
  345. * キャッシュの有効期限の長さ (秒)
  346. *
  347. * @var int
  348. */
  349. private $_expire = 3600;
  350. /**
  351. * キャッシュ処理クラス
  352. *
  353. * @var Cache_Abstract
  354. */
  355. private $_storage = null;
  356. /**
  357. * @return キャッシュ
  358. */
  359. static public function createCache($cacheClass = 'Cache_File') {
  360. return new self($cacheClass);
  361. }
  362. private function __construct($cacheClass) {
  363. $ this->_storage = new $cacheClass();
  364. }
  365. /**
  366. * キャッシュを設定します
  367. *
  368. * @param string $key
  369. * @parammixed $value
  370. * @param int $expire
  371. */
  372. public function set($key, $value, $expire = false) {
  373. if (!$expire) {
  374. $期限切れ = $this->_expire;
  375. }
  376. $this->_storage->checkLock($key);
  377. $data = array('time' => time(), 'expire' => ; $expire, 'valid' => true, 'data' => $value);
  378. $this->_storage->lock($key);
  379. $this->_storage- >store($key, $data);
  380. $this->_storage->unlock($key);
  381. } catch (CacheException $e) {
  382. $this->_storage->unlock($key) );
  383. throw $e;
  384. }
  385. }
  386. /**
  387. * 読み取りキャッシュ
  388. *
  389. * @param string $key
  390. * @returnmixed
  391. */
  392. public function get($key) {
  393. $data = $this->fetch($key);
  394. if ($data && $data['valid'] && !$data['isExpired']) {
  395. return $data['data'];
  396. }
  397. return false;
  398. }
  399. /**
  400. * 期限切れや無効なものを含むキャッシュを読み取り、完全なストレージ構造を取得します
  401. *
  402. * @param string $key
  403. */
  404. public function fetch ($key) {
  405. $this->storage->checkLock($key);
  406. $data = $this->gt;_storage->fetch($key);
  407. if ($data) {
  408. $data ['isExpired'] = (time() - $data['time']) >; $data['期限切れ'] ? true : false;
  409. return $data;
  410. }
  411. return false;
  412. }
  413. /**
  414. * キャッシュを削除します
  415. *
  416. * @param string $key
  417. */
  418. public function delete($key) {
  419. $this->_storage->checkLock($key) )
  420. ->lock($key)
  421. ->delete($key)
  422. ->unlock($key);
  423. }

  424. public function clear() {

  425. $this ->_storage->clear();
  426. }
  427. /**
  428. * キャッシュを無効にする
  429. *
  430. * @param string $key
  431. */
  432. public function setInvalidate($key) {
  433. $this->_storage->checkLock($key)
  434. -> lock($key);
  435. try {
  436. $data = $this->storage->fetch($key);
  437. if ($data) {
  438. $data['valid'] = false;
  439. $this- >_storage->store($key, $data);
  440. }
  441. $this->_storage->unlock($key);
  442. } catch (CacheException $e) {
  443. $this->_storage- >unlock($key);
  444. throw $e;
  445. }
  446. }

  447. /**

  448. * キャッシュの有効期限を設定します
  449. *
  450. * @param int $expire
  451. */
  452. public function setExpire($expire) {
  453. $this-> _expire = (int) $expire;
  454. return $this;
  455. }
  456. }
  457. ?>

复制代码
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。