Cache.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. namespace think;
  12. use think\cache\Driver;
  13. class Cache
  14. {
  15. protected static $instance = [];
  16. public static $readTimes = 0;
  17. public static $writeTimes = 0;
  18. /**
  19. * 操作句柄
  20. * @var object
  21. * @access protected
  22. */
  23. protected static $handler;
  24. /**
  25. * 连接缓存
  26. * @access public
  27. * @param array $options 配置数组
  28. * @param bool|string $name 缓存连接标识 true 强制重新连接
  29. * @return Driver
  30. */
  31. public static function connect(array $options = [], $name = false)
  32. {
  33. $type = !empty($options['type']) ? $options['type'] : 'File';
  34. if (false === $name) {
  35. $name = md5(serialize($options));
  36. }
  37. if (true === $name || !isset(self::$instance[$name])) {
  38. $class = false !== strpos($type, '\\') ? $type : '\\think\\cache\\driver\\' . ucwords($type);
  39. // 记录初始化信息
  40. App::$debug && Log::record('[ CACHE ] INIT ' . $type, 'info');
  41. if (true === $name) {
  42. return new $class($options);
  43. } else {
  44. self::$instance[$name] = new $class($options);
  45. }
  46. }
  47. self::$handler = self::$instance[$name];
  48. return self::$handler;
  49. }
  50. /**
  51. * 自动初始化缓存
  52. * @access public
  53. * @param array $options 配置数组
  54. * @return void
  55. */
  56. public static function init(array $options = [])
  57. {
  58. if (is_null(self::$handler)) {
  59. // 自动初始化缓存
  60. if (!empty($options)) {
  61. self::connect($options);
  62. } elseif ('complex' == Config::get('cache.type')) {
  63. self::connect(Config::get('cache.default'));
  64. } else {
  65. self::connect(Config::get('cache'));
  66. }
  67. }
  68. }
  69. /**
  70. * 切换缓存类型 需要配置 cache.type 为 complex
  71. * @access public
  72. * @param string $name 缓存标识
  73. * @return Driver
  74. */
  75. public static function store($name)
  76. {
  77. if ('complex' == Config::get('cache.type')) {
  78. self::connect(Config::get('cache.' . $name), strtolower($name));
  79. }
  80. return self::$handler;
  81. }
  82. /**
  83. * 判断缓存是否存在
  84. * @access public
  85. * @param string $name 缓存变量名
  86. * @return bool
  87. */
  88. public static function has($name)
  89. {
  90. self::init();
  91. self::$readTimes++;
  92. return self::$handler->has($name);
  93. }
  94. /**
  95. * 读取缓存
  96. * @access public
  97. * @param string $name 缓存标识
  98. * @param mixed $default 默认值
  99. * @return mixed
  100. */
  101. public static function get($name, $default = false)
  102. {
  103. self::init();
  104. self::$readTimes++;
  105. return self::$handler->get($name, $default);
  106. }
  107. /**
  108. * 写入缓存
  109. * @access public
  110. * @param string $name 缓存标识
  111. * @param mixed $value 存储数据
  112. * @param int|null $expire 有效时间 0为永久
  113. * @return boolean
  114. */
  115. public static function set($name, $value, $expire = null)
  116. {
  117. self::init();
  118. self::$writeTimes++;
  119. return self::$handler->set($name, $value, $expire);
  120. }
  121. /**
  122. * 自增缓存(针对数值缓存)
  123. * @access public
  124. * @param string $name 缓存变量名
  125. * @param int $step 步长
  126. * @return false|int
  127. */
  128. public static function inc($name, $step = 1)
  129. {
  130. self::init();
  131. self::$writeTimes++;
  132. return self::$handler->inc($name, $step);
  133. }
  134. /**
  135. * 自减缓存(针对数值缓存)
  136. * @access public
  137. * @param string $name 缓存变量名
  138. * @param int $step 步长
  139. * @return false|int
  140. */
  141. public static function dec($name, $step = 1)
  142. {
  143. self::init();
  144. self::$writeTimes++;
  145. return self::$handler->dec($name, $step);
  146. }
  147. /**
  148. * 删除缓存
  149. * @access public
  150. * @param string $name 缓存标识
  151. * @return boolean
  152. */
  153. public static function rm($name)
  154. {
  155. self::init();
  156. self::$writeTimes++;
  157. return self::$handler->rm($name);
  158. }
  159. /**
  160. * 清除缓存
  161. * @access public
  162. * @param string $tag 标签名
  163. * @return boolean
  164. */
  165. public static function clear($tag = null)
  166. {
  167. self::init();
  168. self::$writeTimes++;
  169. return self::$handler->clear($tag);
  170. }
  171. /**
  172. * 读取缓存并删除
  173. * @access public
  174. * @param string $name 缓存变量名
  175. * @return mixed
  176. */
  177. public static function pull($name)
  178. {
  179. self::init();
  180. self::$readTimes++;
  181. self::$writeTimes++;
  182. return self::$handler->pull($name);
  183. }
  184. /**
  185. * 如果不存在则写入缓存
  186. * @access public
  187. * @param string $name 缓存变量名
  188. * @param mixed $value 存储数据
  189. * @param int $expire 有效时间 0为永久
  190. * @return mixed
  191. */
  192. public static function remember($name, $value, $expire = null)
  193. {
  194. self::init();
  195. self::$readTimes++;
  196. return self::$handler->remember($name, $value, $expire);
  197. }
  198. /**
  199. * 缓存标签
  200. * @access public
  201. * @param string $name 标签名
  202. * @param string|array $keys 缓存标识
  203. * @param bool $overlay 是否覆盖
  204. * @return Driver
  205. */
  206. public static function tag($name, $keys = null, $overlay = false)
  207. {
  208. self::init();
  209. return self::$handler->tag($name, $keys, $overlay);
  210. }
  211. }