X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fparser%2FParserCache.php;h=8a7fca6c29d5c0c76e7270e41a49f3c26b7546f0;hb=b8f5caebcd228c60910f9c28086b278e8e1c4a0a;hp=76a7e1ed7ae3418cbb28dfdb88014d42bf87ce2f;hpb=943a2498d0d081fc057898d594dcd57f5762d3ab;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/parser/ParserCache.php b/includes/parser/ParserCache.php index 76a7e1ed7a..8a7fca6c29 100644 --- a/includes/parser/ParserCache.php +++ b/includes/parser/ParserCache.php @@ -21,25 +21,50 @@ * @ingroup Cache Parser */ +use MediaWiki\MediaWikiServices; + /** * @ingroup Cache Parser * @todo document */ class ParserCache { + /** + * Constants for self::getKey() + * @since 1.30 + */ + + /** Use only current data */ + const USE_CURRENT_ONLY = 0; + + /** Use expired data if current data is unavailable */ + const USE_EXPIRED = 1; + + /** Use expired data or data from different revisions if current data is unavailable */ + const USE_OUTDATED = 2; + + /** + * Use expired data and data from different revisions, and if all else + * fails vary on all variable options + */ + const USE_ANYTHING = 3; + /** @var BagOStuff */ private $mMemc; + + /** + * Anything cached prior to this is invalidated + * + * @var string + */ + private $cacheEpoch; /** * Get an instance of this object * + * @deprecated since 1.30, use MediaWikiServices instead * @return ParserCache */ public static function singleton() { - static $instance; - if ( !isset( $instance ) ) { - global $parserMemc; - $instance = new ParserCache( $parserMemc ); - } - return $instance; + return MediaWikiServices::getInstance()->getParserCache(); } /** @@ -48,11 +73,13 @@ class ParserCache { * This class use an invalidation strategy that is compatible with * MultiWriteBagOStuff in async replication mode. * - * @param BagOStuff $memCached + * @param BagOStuff $cache + * @param string $cacheEpoch Anything before this timestamp is invalidated * @throws MWException */ - protected function __construct( BagOStuff $memCached ) { - $this->mMemc = $memCached; + public function __construct( BagOStuff $cache, $cacheEpoch = '20030516000000' ) { + $this->mMemc = $cache; + $this->cacheEpoch = $cacheEpoch; } /** @@ -103,7 +130,7 @@ class ParserCache { */ public function getETag( $article, $popts ) { return 'W/"' . $this->getParserOutputKey( $article, - $popts->optionsHash( ParserOptions::legacyOptions(), $article->getTitle() ) ) . + $popts->optionsHash( ParserOptions::allCacheVaryingOptions(), $article->getTitle() ) ) . "--" . $article->getTouched() . '"'; } @@ -130,15 +157,18 @@ class ParserCache { * It would be preferable to have this code in get() * instead of having Article looking in our internals. * - * @todo Document parameter $useOutdated - * * @param WikiPage $article * @param ParserOptions $popts - * @param bool $useOutdated (default true) + * @param int|bool $useOutdated One of the USE constants. For backwards + * compatibility, boolean false is treated as USE_CURRENT_ONLY and + * boolean true is treated as USE_ANYTHING. * @return bool|mixed|string + * @since 1.30 Changed $useOutdated to an int and added the non-boolean values */ - public function getKey( $article, $popts, $useOutdated = true ) { - global $wgCacheEpoch; + public function getKey( $article, $popts, $useOutdated = self::USE_ANYTHING ) { + if ( is_bool( $useOutdated ) ) { + $useOutdated = $useOutdated ? self::USE_ANYTHING : self::USE_CURRENT_ONLY; + } if ( $popts instanceof User ) { wfWarn( "Use of outdated prototype ParserCache::getKey( &\$article, &\$user )\n" ); @@ -150,14 +180,16 @@ class ParserCache { $optionsKey = $this->mMemc->get( $this->getOptionsKey( $article ), $casToken, BagOStuff::READ_VERIFIED ); if ( $optionsKey instanceof CacheTime ) { - if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) { + if ( $useOutdated < self::USE_EXPIRED && $optionsKey->expired( $article->getTouched() ) ) { wfIncrStats( "pcache.miss.expired" ); $cacheTime = $optionsKey->getCacheTime(); wfDebugLog( "ParserCache", "Parser options key expired, touched " . $article->getTouched() - . ", epoch $wgCacheEpoch, cached $cacheTime\n" ); + . ", epoch {$this->cacheEpoch}, cached $cacheTime\n" ); return false; - } elseif ( !$useOutdated && $optionsKey->isDifferentRevision( $article->getLatest() ) ) { + } elseif ( $useOutdated < self::USE_OUTDATED && + $optionsKey->isDifferentRevision( $article->getLatest() ) + ) { wfIncrStats( "pcache.miss.revid" ); $revId = $article->getLatest(); $cachedRevId = $optionsKey->getCacheRevisionId(); @@ -171,10 +203,10 @@ class ParserCache { $usedOptions = $optionsKey->mUsedOptions; wfDebug( "Parser cache options found.\n" ); } else { - if ( !$useOutdated ) { + if ( $useOutdated < self::USE_ANYTHING ) { return false; } - $usedOptions = ParserOptions::legacyOptions(); + $usedOptions = ParserOptions::allCacheVaryingOptions(); } return $this->getParserOutputKey( @@ -194,8 +226,6 @@ class ParserCache { * @return ParserOutput|bool False on failure */ public function get( $article, $popts, $useOutdated = false ) { - global $wgCacheEpoch; - $canCache = $article->checkTouched(); if ( !$canCache ) { // It's a redirect now @@ -204,7 +234,9 @@ class ParserCache { $touched = $article->getTouched(); - $parserOutputKey = $this->getKey( $article, $popts, $useOutdated ); + $parserOutputKey = $this->getKey( $article, $popts, + $useOutdated ? self::USE_OUTDATED : self::USE_CURRENT_ONLY + ); if ( $parserOutputKey === false ) { wfIncrStats( 'pcache.miss.absent' ); return false; @@ -221,11 +253,6 @@ class ParserCache { wfDebug( "ParserOutput cache found.\n" ); - // The edit section preference may not be the appropiate one in - // the ParserOutput, as we are not storing it in the parsercache - // key. Force it here. See T33445. - $value->setEditSectionTokens( $popts->getEditSection() ); - $wikiPage = method_exists( $article, 'getPage' ) ? $article->getPage() : $article; @@ -235,7 +262,7 @@ class ParserCache { $cacheTime = $value->getCacheTime(); wfDebugLog( "ParserCache", "ParserOutput key expired, touched $touched, " - . "epoch $wgCacheEpoch, cached $cacheTime\n" ); + . "epoch {$this->cacheEpoch}, cached $cacheTime\n" ); $value = false; } elseif ( !$useOutdated && $value->isDifferentRevision( $article->getLatest() ) ) { wfIncrStats( "pcache.miss.revid" ); @@ -313,4 +340,15 @@ class ParserCache { wfDebug( "Parser output was marked as uncacheable and has not been saved.\n" ); } } + + /** + * Get the backend BagOStuff instance that + * powers the parser cache + * + * @since 1.30 + * @return BagOStuff + */ + public function getCacheStorage() { + return $this->mMemc; + } }