MediaWiki REL1_31
MapCacheLRU.php
Go to the documentation of this file.
1<?php
23use Wikimedia\Assert\Assert;
24
36 protected $cache = []; // (key => value)
37
38 protected $maxCacheKeys; // integer; max entries
39
44 public function __construct( $maxKeys ) {
45 Assert::parameterType( 'integer', $maxKeys, '$maxKeys' );
46 Assert::parameter( $maxKeys > 0, '$maxKeys', 'must be above zero' );
47
48 $this->maxCacheKeys = $maxKeys;
49 }
50
57 public static function newFromArray( array $values, $maxKeys ) {
58 $mapCache = new self( $maxKeys );
59 $mapCache->cache = ( count( $values ) > $maxKeys )
60 ? array_slice( $values, -$maxKeys, null, true )
61 : $values;
62
63 return $mapCache;
64 }
65
70 public function toArray() {
71 return $this->cache;
72 }
73
89 public function set( $key, $value, $rank = 1.0 ) {
90 if ( $this->has( $key ) ) {
91 $this->ping( $key );
92 } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
93 reset( $this->cache );
94 $evictKey = key( $this->cache );
95 unset( $this->cache[$evictKey] );
96 }
97
98 if ( $rank < 1.0 && $rank > 0 ) {
99 $offset = intval( $rank * count( $this->cache ) );
100 $this->cache = array_slice( $this->cache, 0, $offset, true )
101 + [ $key => $value ]
102 + array_slice( $this->cache, $offset, null, true );
103 } else {
104 $this->cache[$key] = $value;
105 }
106 }
107
114 public function has( $key ) {
115 if ( !is_int( $key ) && !is_string( $key ) ) {
116 throw new UnexpectedValueException(
117 __METHOD__ . ' called with invalid key. Must be string or integer.' );
118 }
119 return array_key_exists( $key, $this->cache );
120 }
121
130 public function get( $key ) {
131 if ( !$this->has( $key ) ) {
132 return null;
133 }
134
135 $this->ping( $key );
136
137 return $this->cache[$key];
138 }
139
144 public function getAllKeys() {
145 return array_keys( $this->cache );
146 }
147
159 public function getWithSetCallback( $key, callable $callback, $rank = 1.0 ) {
160 if ( $this->has( $key ) ) {
161 $value = $this->get( $key );
162 } else {
163 $value = call_user_func( $callback );
164 if ( $value !== false ) {
165 $this->set( $key, $value, $rank );
166 }
167 }
168
169 return $value;
170 }
171
178 public function clear( $keys = null ) {
179 if ( $keys === null ) {
180 $this->cache = [];
181 } else {
182 foreach ( (array)$keys as $key ) {
183 unset( $this->cache[$key] );
184 }
185 }
186 }
187
193 protected function ping( $key ) {
194 $item = $this->cache[$key];
195 unset( $this->cache[$key] );
196 $this->cache[$key] = $item;
197 }
198}
Handles a simple LRU key/value map with a maximum number of entries.
getWithSetCallback( $key, callable $callback, $rank=1.0)
Get an item with the given key, producing and setting it if not found.
static newFromArray(array $values, $maxKeys)
has( $key)
Check if a key exists.
__construct( $maxKeys)
ping( $key)
Push an entry to the top of the cache.
clear( $keys=null)
Clear one or several cache entries, or all cache entries.
design txt This is a brief overview of the new design More thorough and up to date information is available on the documentation wiki at etc Handles the details of getting and saving to the user table of the and dealing with sessions and cookies OutputPage Encapsulates the entire HTML page that will be sent in response to any server request It is used by calling its functions to add in any and then calling but I prefer the flexibility This should also do the output encoding The system allocates a global one in $wgOut Title Represents the title of an and does all the work of translating among various forms such as plain database key
Definition design.txt:26
you have access to all of the normal MediaWiki so you can get a DB use the cache
$cache
Definition mcc.php:33