PageRenderTime 50ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/aoliz/aoliz_tuan/include/library/Cache.class.php

http://phpfor.googlecode.com/
PHP | 186 lines | 159 code | 24 blank | 3 comment | 15 complexity | 9ea332155fd13d92122b14f906bd7dba MD5 | raw file
  1. <?php
  2. /**
  3. * @author: shwdai@gmail.com
  4. */
  5. class FalseCache{public function __call($m, $v){}};
  6. class Cache
  7. {
  8. static private $mCache = null;
  9. static private $gCache = array();
  10. static private $mInstance = null;
  11. static private $mIndex = 0;
  12. static public function Instance()
  13. {
  14. if ( !self::$mInstance ) self::$mInstance = new Cache();
  15. }
  16. static private function _CreateCacheInstance()
  17. {
  18. $ini = Config::Instance('php'); settype($ini['memcache'],'array');
  19. if (!class_exists('Memcache', false)) return new FalseCache();
  20. $cache_instance = new Memcache();
  21. foreach( $ini['memcache'] AS $one )
  22. {
  23. $server = (string) $one;
  24. list($ip, $port, $weight) = explode(':', $server);
  25. if(!$ip || $port || $weight) continue;
  26. $cache_instance->addServer( $ip
  27. ,$port
  28. ,true
  29. ,$weight
  30. ,1
  31. ,15
  32. ,true
  33. ,array('Cache','FailureCallback')
  34. );
  35. self::$mIndex++;
  36. }
  37. return self::$mIndex ? $cache_instance : new FalseCache();
  38. }
  39. private function __construct()
  40. {
  41. self::$mCache = self::_CreateCacheInstance();
  42. }
  43. static public function FailureCallback($ip, $port)
  44. {
  45. self::$mIndex--; if (self::$mIndex<=0) self::$mCache = new FalseCache();
  46. }
  47. static function Get($key)
  48. {
  49. self::Instance();
  50. if (is_array($key)) {
  51. $v = array();
  52. foreach($key as $k) {
  53. $vv = self::Get($k);
  54. if ($vv) {
  55. $v[$k] = $vv;
  56. }
  57. }
  58. return $v;
  59. } else {
  60. if(isset(self::$gCache[$key])) {
  61. return self::$gCache[$key];
  62. }
  63. $v = self::$mCache->get($key);
  64. if ($v) { self::$gCache[$key] = $v; }
  65. return $v;
  66. }
  67. }
  68. static function Add($key, $var, $flag=0, $expire=0) {
  69. self::Instance();
  70. self::$mCache->add($key,$var,$flag,$expire);
  71. self::$gCache[$key] = $var;
  72. }
  73. static function Dec($key, $value=1)
  74. {
  75. self::Instance();
  76. return self::$mCache->decrement($key, $value);
  77. }
  78. static function Inc($key, $value=1)
  79. {
  80. self::Instance();
  81. return self::$mCache->increment($key, $value);
  82. }
  83. static function Replace($key, $var, $flag=0, $expire=0)
  84. {
  85. self::Instance();
  86. return self::$mCache->replace($key, $var, $flag, $expire);
  87. }
  88. static function Set($key, $var, $flag=0, $expire=0) {
  89. self::Instance();
  90. self::$mCache->set($key, $var, $flag, $expire);
  91. self::$gCache[$key] = $var;
  92. return true;
  93. }
  94. static function Del($key, $timeout=0) {
  95. self::Instance();
  96. if (is_array($key)) {
  97. foreach ($key as $k) {
  98. self::$mCache->delete($k, $timeout);
  99. if (isset(self::$gCache[$k])) unset(self::$gCache[$k]);
  100. }
  101. } else {
  102. self::$mCache->delete($key, $timeout);
  103. if (isset(self::$gCache[$key])) unset(self::$gCache[$k]);
  104. }
  105. return true;
  106. }
  107. static function Flush()
  108. {
  109. self::Instance();
  110. return self::$mCache->flush();
  111. }
  112. static function GetFunctionKey($callback, $args=array())
  113. {
  114. $args = ksort($args);
  115. $patt = "/(=>)\s*'(\d+)'/";
  116. $args_string = var_export($args, true);
  117. $args_string = preg_replace($patt, "\\1\\2", $args_string);
  118. $key = "[FUNC]:$callback($args_string)";
  119. return self::GenKey( $key );
  120. }
  121. static function GetStringKey($str=null) {
  122. settype($str, 'array'); $str = var_export($str,true);
  123. $key = "[STR]:{$str}";
  124. return self::GenKey( $key );
  125. }
  126. static function GetObjectKey($tablename, $id)
  127. {
  128. $key = "[OBJ]:$tablename($id)";
  129. return self::GenKey( $key );
  130. }
  131. static function GenKey($key) {
  132. $hash = dirname(__FILE__);
  133. return md5( $hash . $key );
  134. }
  135. static function SetObject($tablename, $one) {
  136. self::Instance();
  137. foreach($one AS $oone) {
  138. $k = self::GetObjectKey($tablename, $oone['id']);
  139. self::Set($k, $oone);
  140. }
  141. return true;
  142. }
  143. static function GetObject($tablename, $id) {
  144. $single = ! is_array($id);
  145. settype($id, 'array');
  146. $k = array();
  147. foreach($id AS $oid) {
  148. $k[] = self::GetObjectKey($tablename, $oid);
  149. }
  150. $r = Utility::AssColumn(self::Get($k), 'id');
  151. return $single ? array_pop($r) : $r;
  152. }
  153. static function ClearObject($tablename, $id) {
  154. settype($id, 'array');
  155. foreach($id AS $oid) {
  156. $key = self::GetObjectKey($tablename, $oid);
  157. self::Del($key);
  158. }
  159. return true;
  160. }
  161. }
  162. ?>