| | <?php |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | namespace think\cache; |
| |
|
| | |
| | |
| | |
| | abstract class Driver |
| | { |
| | protected $handler = null; |
| | protected $options = []; |
| | protected $tag; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | abstract public function has($name); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | abstract public function get($name, $default = false); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | abstract public function set($name, $value, $expire = null); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | abstract public function inc($name, $step = 1); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | abstract public function dec($name, $step = 1); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | abstract public function rm($name); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | abstract public function clear($tag = null); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | protected function getCacheKey($name) |
| | { |
| | return $this->options['prefix'] . $name; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function pull($name) |
| | { |
| | $result = $this->get($name, false); |
| | if ($result) { |
| | $this->rm($name); |
| | return $result; |
| | } else { |
| | return; |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function remember($name, $value, $expire = null) |
| | { |
| | if (!$this->has($name)) { |
| | $time = time(); |
| | while ($time + 5 > time() && $this->has($name . '_lock')) { |
| | |
| | usleep(200000); |
| | } |
| |
|
| | try { |
| | |
| | $this->set($name . '_lock', true); |
| | if ($value instanceof \Closure) { |
| | $value = call_user_func($value); |
| | } |
| | $this->set($name, $value, $expire); |
| | |
| | $this->rm($name . '_lock'); |
| | } catch (\Exception $e) { |
| | |
| | $this->rm($name . '_lock'); |
| | throw $e; |
| | } catch (\throwable $e) { |
| | $this->rm($name . '_lock'); |
| | throw $e; |
| | } |
| | } else { |
| | $value = $this->get($name); |
| | } |
| | return $value; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function tag($name, $keys = null, $overlay = false) |
| | { |
| | if (is_null($name)) { |
| |
|
| | } elseif (is_null($keys)) { |
| | $this->tag = $name; |
| | } else { |
| | $key = 'tag_' . md5($name); |
| | if (is_string($keys)) { |
| | $keys = explode(',', $keys); |
| | } |
| | $keys = array_map([$this, 'getCacheKey'], $keys); |
| | if ($overlay) { |
| | $value = $keys; |
| | } else { |
| | $value = array_unique(array_merge($this->getTagItem($name), $keys)); |
| | } |
| | $this->set($key, implode(',', $value), 0); |
| | } |
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | protected function setTagItem($name) |
| | { |
| | if ($this->tag) { |
| | $key = 'tag_' . md5($this->tag); |
| | $this->tag = null; |
| | if ($this->has($key)) { |
| | $value = explode(',', $this->get($key)); |
| | $value[] = $name; |
| | $value = implode(',', array_unique($value)); |
| | } else { |
| | $value = $name; |
| | } |
| | $this->set($key, $value, 0); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | protected function getTagItem($tag) |
| | { |
| | $key = 'tag_' . md5($tag); |
| | $value = $this->get($key); |
| | if ($value) { |
| | return array_filter(explode(',', $value)); |
| | } else { |
| | return []; |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function handler() |
| | { |
| | return $this->handler; |
| | } |
| | } |
| |
|