diff --git a/laravel/cache/drivers/memcached.php b/laravel/cache/drivers/memcached.php index aeedc088..9b3af1a7 100644 --- a/laravel/cache/drivers/memcached.php +++ b/laravel/cache/drivers/memcached.php @@ -1,13 +1,13 @@ get($this->section_item_key($section, $key), $default); + } + /** * Write an item to the cache for a given number of minutes. * @@ -71,6 +84,20 @@ class Memcached extends Driver { $this->memcache->set($this->key.$key, $value, $minutes * 60); } + /** + * Write a sectioned item to the cache. + * + * @param string $section + * @param string $key + * @param mixed $value + * @param int $minutes + * @return void + */ + public function put_in_section($section, $key, $value, $minutes) + { + $this->put($this->section_item_key($section, $key), $value, $minutes); + } + /** * Write an item to the cache that lasts forever. * @@ -83,6 +110,48 @@ class Memcached extends Driver { return $this->put($key, $value, 0); } + /** + * Write a sectioned item to the cache that lasts forever. + * + * @param string $section + * @param string $key + * @param mixed $value + * @return void + */ + public function forever_in_section($section, $key, $value) + { + return $this->forever($this->section_item_key($section, $key), $value); + } + + /** + * Get a sectioned item from the cache, or cache and return the default value. + * + * @param string $section + * @param string $key + * @param mixed $default + * @param int $minutes + * @return mixed + */ + public function remember_in_section($section, $key, $default, $minutes, $function = 'put') + { + $key = $this->section_item_key($section, $key); + + return $this->remember($key, $default, $minutes, $function); + } + + /** + * Get a sectioned item from the cache, or cache the default value forever. + * + * @param string $section + * @param string $key + * @param mixed $default + * @return mixed + */ + public function sear_in_section($section, $key, $default) + { + return $this->sear($this->section_item_key($section, $key), $default); + } + /** * Delete an item from the cache. * @@ -94,4 +163,86 @@ class Memcached extends Driver { $this->memcache->delete($this->key.$key); } + /** + * Delete a sectioned item from the cache. + * + * @param string $section + * @param string $key + * @return void + */ + public function forget_in_section($section, $key) + { + return $this->forget($this->section_item_key($section, $key)); + } + + /** + * Delete an entire section from the cache. + * + * @param string $section + * @return int|bool + */ + public function forget_section($section) + { + return $this->memcache->increment($this->key.$this->section_key($section)); + } + + /** + * Get the current section ID for a given section. + * + * @param string $section + * @return int + */ + protected function section_id($section) + { + return $this->sear($this->section_key($section), function() + { + return rand(1, 10000); + }); + } + + /** + * Get a section key name for a given section. + * + * @param string $section + * @return string + */ + protected function section_key($section) + { + return $section.'_section_key'; + } + + /** + * Get a section item key for a given section and key. + * + * @param string $section + * @param string $key + * @return string + */ + protected function section_item_key($section, $key) + { + return $section.'#'.$this->section_id($section).'#'.$key; + } + + /** + * Determine if a key is sectioned. + * + * @param string $key + * @return bool + */ + protected function sectioned($key) + { + return str_contains($key, '::'); + } + + /** + * Get the section and key from a sectioned key. + * + * @param string $key + * @return array + */ + protected function parse($key) + { + return explode('::', $key, 2); + } + } \ No newline at end of file diff --git a/laravel/cache/drivers/sectionable.php b/laravel/cache/drivers/sectionable.php new file mode 100644 index 00000000..92ba81d4 --- /dev/null +++ b/laravel/cache/drivers/sectionable.php @@ -0,0 +1,74 @@ +