diff options
author | Andrew Dolgov <[email protected]> | 2022-11-23 21:14:33 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2022-11-23 21:14:33 +0300 |
commit | 0c8af4992cb0f7589dcafaad65ada12753c64594 (patch) | |
tree | 18e83d068c3e7dd2499331de977782b382279396 /vendor/aws/aws-sdk-php/src/LruArrayCache.php |
initial
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/LruArrayCache.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/LruArrayCache.php | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/LruArrayCache.php b/vendor/aws/aws-sdk-php/src/LruArrayCache.php new file mode 100644 index 0000000..84dfb13 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/LruArrayCache.php @@ -0,0 +1,83 @@ +<?php +namespace Aws; + +/** + * Simple in-memory LRU cache that limits the number of cached entries. + * + * The LRU cache is implemented using PHP's ordered associative array. When + * accessing an element, the element is removed from the hash and re-added to + * ensure that recently used items are always at the end of the list while + * least recently used are at the beginning. When a value is added to the + * cache, if the number of cached items exceeds the allowed number, the first + * N number of items are removed from the array. + */ +class LruArrayCache implements CacheInterface, \Countable +{ + /** @var int */ + private $maxItems; + + /** @var array */ + private $items = array(); + + /** + * @param int $maxItems Maximum number of allowed cache items. + */ + public function __construct($maxItems = 1000) + { + $this->maxItems = $maxItems; + } + + public function get($key) + { + if (!isset($this->items[$key])) { + return null; + } + + $entry = $this->items[$key]; + + // Ensure the item is not expired. + if (!$entry[1] || time() < $entry[1]) { + // LRU: remove the item and push it to the end of the array. + unset($this->items[$key]); + $this->items[$key] = $entry; + return $entry[0]; + } + + unset($this->items[$key]); + return null; + } + + public function set($key, $value, $ttl = 0) + { + // Only call time() if the TTL is not 0/false/null + $ttl = $ttl ? time() + $ttl : 0; + $this->items[$key] = [$value, $ttl]; + + // Determine if there are more items in the cache than allowed. + $diff = count($this->items) - $this->maxItems; + + // Clear out least recently used items. + if ($diff > 0) { + // Reset to the beginning of the array and begin unsetting. + reset($this->items); + for ($i = 0; $i < $diff; $i++) { + unset($this->items[key($this->items)]); + next($this->items); + } + } + } + + public function remove($key) + { + unset($this->items[$key]); + } + + /** + * @return int + */ + #[\ReturnTypeWillChange] + public function count() + { + return count($this->items); + } +} |