MediaWiki REL1_34
CacheHelper.php
Go to the documentation of this file.
1<?php
26
45class CacheHelper implements ICacheHelper {
52 protected $cacheExpiry = 3600;
53
62 protected $cachedChunks;
63
71 protected $hasCached = null;
72
79 protected $cacheEnabled = true;
80
87 protected $onInitHandler;
88
95 protected $cacheKey = [];
96
103 public function setCacheEnabled( $cacheEnabled ) {
104 $this->cacheEnabled = $cacheEnabled;
105 }
106
116 public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
117 if ( is_null( $this->hasCached ) ) {
118 if ( !is_null( $cacheExpiry ) ) {
119 $this->cacheExpiry = $cacheExpiry;
120 }
121
122 if ( !is_null( $cacheEnabled ) ) {
124 }
125
126 $this->initCaching();
127 }
128 }
129
141 public function getCachedNotice( IContextSource $context, $includePurgeLink = true ) {
142 if ( $this->cacheExpiry < 86400 * 3650 ) {
143 $message = $context->msg(
144 'cachedspecial-viewing-cached-ttl',
145 $context->getLanguage()->formatDuration( $this->cacheExpiry )
146 )->escaped();
147 } else {
148 $message = $context->msg(
149 'cachedspecial-viewing-cached-ts'
150 )->escaped();
151 }
152
153 if ( $includePurgeLink ) {
154 $refreshArgs = $context->getRequest()->getQueryValues();
155 unset( $refreshArgs['title'] );
156 $refreshArgs['action'] = 'purge';
157
158 $subPage = $context->getTitle()->getFullText();
159 $subPage = explode( '/', $subPage, 2 );
160 $subPage = count( $subPage ) > 1 ? $subPage[1] : false;
161
162 $message .= ' ' . MediaWikiServices::getInstance()->getLinkRenderer()->makeLink(
163 $context->getTitle( $subPage ),
164 $context->msg( 'cachedspecial-refresh-now' )->text(),
165 [],
166 $refreshArgs
167 );
168 }
169
170 return $message;
171 }
172
179 protected function initCaching() {
180 if ( $this->cacheEnabled && is_null( $this->hasCached ) ) {
182
183 $this->hasCached = is_array( $cachedChunks );
184 $this->cachedChunks = $this->hasCached ? $cachedChunks : [];
185
186 if ( $this->onInitHandler !== null ) {
187 call_user_func( $this->onInitHandler, $this->hasCached );
188 }
189 }
190 }
191
206 public function getCachedValue( $computeFunction, $args = [], $key = null ) {
207 $this->initCaching();
208
209 if ( $this->cacheEnabled && $this->hasCached ) {
210 $value = null;
211
212 if ( is_null( $key ) ) {
213 reset( $this->cachedChunks );
214 $itemKey = key( $this->cachedChunks );
215
216 if ( !is_int( $itemKey ) ) {
217 wfWarn( "Attempted to get item with non-numeric key while " .
218 "the next item in the queue has a key ($itemKey) in " . __METHOD__ );
219 } elseif ( is_null( $itemKey ) ) {
220 wfWarn( "Attempted to get an item while the queue is empty in " . __METHOD__ );
221 } else {
222 $value = array_shift( $this->cachedChunks );
223 }
224 } elseif ( array_key_exists( $key, $this->cachedChunks ) ) {
225 $value = $this->cachedChunks[$key];
226 unset( $this->cachedChunks[$key] );
227 } else {
228 wfWarn( "There is no item with key '$key' in this->cachedChunks in " . __METHOD__ );
229 }
230 } else {
231 if ( !is_array( $args ) ) {
232 $args = [ $args ];
233 }
234
235 $value = $computeFunction( ...$args );
236
237 if ( $this->cacheEnabled ) {
238 if ( is_null( $key ) ) {
239 $this->cachedChunks[] = $value;
240 } else {
241 $this->cachedChunks[$key] = $value;
242 }
243 }
244 }
245
246 return $value;
247 }
248
255 public function saveCache() {
256 if ( $this->cacheEnabled && $this->hasCached === false && !empty( $this->cachedChunks ) ) {
258 $this->getCacheKeyString(),
259 $this->cachedChunks,
260 $this->cacheExpiry
261 );
262 }
263 }
264
273 public function setExpiry( $cacheExpiry ) {
274 $this->cacheExpiry = $cacheExpiry;
275 }
276
286 protected function getCacheKeyString() {
287 if ( $this->cacheKey === [] ) {
288 throw new MWException( 'No cache key set, so cannot obtain or save the CacheHelper values.' );
289 }
290
291 return ObjectCache::getLocalClusterInstance()->makeKey(
292 ...array_values( $this->cacheKey )
293 );
294 }
295
303 public function setCacheKey( array $cacheKey ) {
304 $this->cacheKey = $cacheKey;
305 }
306
314 public function rebuildOnDemand() {
315 $this->hasCached = false;
316 }
317
325 public function setOnInitializedHandler( $handlerFunction ) {
326 $this->onInitHandler = $handlerFunction;
327 }
328}
wfWarn( $msg, $callerOffset=1, $level=E_USER_NOTICE)
Send a warning either to the debug log or in a PHP error depending on $wgDevelopmentWarnings.
wfGetCache( $cacheType)
Get a specific cache object.
if( $line===false) $args
Definition cdb.php:64
Helper class for caching various elements in a single cache entry.
bool $cacheEnabled
If the cache is enabled or not.
saveCache()
Saves the HTML to the cache in case it got recomputed.
setOnInitializedHandler( $handlerFunction)
Sets a function that gets called when initialization of the cache is done.
array $cacheKey
Elements to build a cache key with.
getCachedValue( $computeFunction, $args=[], $key=null)
Get a cached value if available or compute it if not and then cache it if possible.
setExpiry( $cacheExpiry)
Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry....
startCache( $cacheExpiry=null, $cacheEnabled=null)
Initializes the caching.
getCacheKeyString()
Returns the cache key to use to cache this page's HTML output.
bool null $hasCached
Indicates if the to be cached content was already cached.
callable null $onInitHandler
Function that gets called when initialization is done.
setCacheEnabled( $cacheEnabled)
Sets if the cache should be enabled or not.
setCacheKey(array $cacheKey)
Sets the cache key that should be used.
array $cachedChunks
List of HTML chunks to be cached (if !hasCached) or that where cached (of hasCached).
rebuildOnDemand()
Rebuild the content, even if it's already cached.
getCachedNotice(IContextSource $context, $includePurgeLink=true)
Returns a message that notifies the user he/she is looking at a cached version of the page,...
initCaching()
Initializes the caching if not already done so.
int $cacheExpiry
The time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
MediaWiki exception.
MediaWikiServices is the service locator for the application scope of MediaWiki.
const CACHE_ANYTHING
Definition Defines.php:90
Interface for all classes implementing CacheHelper functionality.
Interface for objects which can provide a MediaWiki context on request.
$context
Definition load.php:45