X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fcache%2FMessageCache.php;h=0c2f9de9b5fcb3df5f14c6a43d8ad68ec2da5ff9;hp=f393acde06b450a5e780e58edad5a4092b516bf2;hb=3a4105ba01fc92f2d41e0faee316d02e29f82fe5;hpb=f43fa6f4f0e2cb60b8543daad661b48a3e0653a9 diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index f393acde06..0c2f9de9b5 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -21,6 +21,7 @@ * @ingroup Cache */ use MediaWiki\MediaWikiServices; +use Wikimedia\ScopedCallback; /** * MediaWiki message cache structure version. @@ -143,13 +144,9 @@ class MessageCache { * @param bool $useDB * @param int $expiry Lifetime for cache. @see $mExpiry. */ - function __construct( $memCached, $useDB, $expiry ) { + function __construct( BagOStuff $memCached, $useDB, $expiry ) { global $wgUseLocalMessageCache; - if ( !$memCached ) { - $memCached = wfGetCache( CACHE_NONE ); - } - $this->mMemc = $memCached; $this->mDisable = !$useDB; $this->mExpiry = $expiry; @@ -227,17 +224,14 @@ class MessageCache { * or false if populating empty cache fails. Also returns true if MessageCache * is disabled. * - * @param bool|string $code Language to which load messages - * @param integer $mode Use MessageCache::FOR_UPDATE to skip process cache + * @param string $code Language to which load messages + * @param integer $mode Use MessageCache::FOR_UPDATE to skip process cache [optional] * @throws MWException * @return bool */ - function load( $code = false, $mode = null ) { + protected function load( $code, $mode = null ) { if ( !is_string( $code ) ) { - # This isn't really nice, so at least make a note about it and try to - # fall back - wfDebug( __METHOD__ . " called without providing a language code\n" ); - $code = 'en'; + throw new InvalidArgumentException( "Missing language code" ); } # Don't do double loading... @@ -631,11 +625,11 @@ class MessageCache { if ( $dest === 'all' ) { $cacheKey = wfMemcKey( 'messages', $code ); $success = $this->mMemc->set( $cacheKey, $cache ); + $this->setValidationHash( $code, $cache ); } else { $success = true; } - $this->setValidationHash( $code, $cache ); $this->saveToLocalCache( $code, $cache ); return $success; @@ -864,6 +858,8 @@ class MessageCache { } $alreadyTried[ $langcode ] = true; } + } else { + $uckey = null; } // Check the CDB cache @@ -881,7 +877,8 @@ class MessageCache { continue; } - $message = $this->getMsgFromNamespace( $this->getMessagePageName( $code, $uckey ), $code ); + $message = $this->getMsgFromNamespace( + $this->getMessagePageName( $code, $uckey ), $code ); if ( $message !== false ) { return $message; @@ -946,28 +943,47 @@ class MessageCache { return false; } - # Try the individual message cache + // Try the individual message cache $titleKey = wfMemcKey( 'messages', 'individual', $title ); - $entry = $this->wanCache->get( $titleKey ); + + $curTTL = null; + $entry = $this->wanCache->get( + $titleKey, + $curTTL, + [ wfMemcKey( 'messages', $code ) ] + ); + $entry = ( $curTTL >= 0 ) ? $entry : false; + if ( $entry ) { if ( substr( $entry, 0, 1 ) === ' ' ) { $this->mCache[$code][$title] = $entry; - - // The message exists, so make sure a string - // is returned. + // The message exists, so make sure a string is returned return (string)substr( $entry, 1 ); } elseif ( $entry === '!NONEXISTENT' ) { $this->mCache[$code][$title] = '!NONEXISTENT'; return false; } else { - # Corrupt/obsolete entry, delete it + // Corrupt/obsolete entry, delete it $this->wanCache->delete( $titleKey ); } } - # Try loading it from the database - $revision = Revision::newFromTitle( Title::makeTitle( NS_MEDIAWIKI, $title ) ); + // Try loading it from the database + $dbr = wfGetDB( DB_REPLICA ); + $cacheOpts = Database::getCacheSetOptions( $dbr ); + // Use newKnownCurrent() to avoid querying revision/user tables + $titleObj = Title::makeTitle( NS_MEDIAWIKI, $title ); + if ( $titleObj->getLatestRevID() ) { + $revision = Revision::newKnownCurrent( + $dbr, + $titleObj->getArticleID(), + $titleObj->getLatestRevID() + ); + } else { + $revision = false; + } + if ( $revision ) { $content = $revision->getContent(); if ( !$content ) { @@ -994,7 +1010,7 @@ class MessageCache { $message = false; // negative caching } else { $this->mCache[$code][$title] = ' ' . $message; - $this->wanCache->set( $titleKey, ' ' . $message, $this->mExpiry ); + $this->wanCache->set( $titleKey, ' ' . $message, $this->mExpiry, $cacheOpts ); } } } else { @@ -1003,7 +1019,7 @@ class MessageCache { if ( $message === false ) { // negative caching $this->mCache[$code][$title] = '!NONEXISTENT'; - $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry ); + $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry, $cacheOpts ); } return $message;