* @todo document
*/
class ParserCache {
- /** @var MWMemcached */
+ /** @var BagOStuff */
private $mMemc;
/**
* Get an instance of this object
* Setup a cache pathway with a given back-end storage mechanism.
* May be a memcached client or a BagOStuff derivative.
*
- * @param MWMemcached $memCached
+ * @param BagOStuff $memCached
* @throws MWException
*/
protected function __construct( $memCached ) {
// Determine the options which affect this article
$optionsKey = $this->mMemc->get( $this->getOptionsKey( $article ) );
- if ( $optionsKey != false ) {
+ if ( $optionsKey instanceof CacheTime ) {
if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) {
- wfIncrStats( "pcache_miss_expired" );
+ wfIncrStats( "pcache.miss.expired" );
$cacheTime = $optionsKey->getCacheTime();
wfDebug( "Parser options key expired, touched " . $article->getTouched()
. ", epoch $wgCacheEpoch, cached $cacheTime\n" );
return false;
} elseif ( $optionsKey->isDifferentRevision( $article->getLatest() ) ) {
- wfIncrStats( "pcache_miss_revid" );
+ wfIncrStats( "pcache.miss.revid" );
$revId = $article->getLatest();
$cachedRevId = $optionsKey->getCacheRevisionId();
wfDebug( "ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n" );
* Retrieve the ParserOutput from ParserCache.
* false if not found or outdated.
*
- * @param WikiPage $article
+ * @param WikiPage|Article $article
* @param ParserOptions $popts
* @param bool $useOutdated (default false)
*
$parserOutputKey = $this->getKey( $article, $popts, $useOutdated );
if ( $parserOutputKey === false ) {
- wfIncrStats( 'pcache_miss_absent' );
+ wfIncrStats( 'pcache.miss.absent' );
return false;
}
$value = $this->mMemc->get( $parserOutputKey );
if ( !$value ) {
wfDebug( "ParserOutput cache miss.\n" );
- wfIncrStats( "pcache_miss_absent" );
+ wfIncrStats( "pcache.miss.absent" );
return false;
}
// key. Force it here. See bug 31445.
$value->setEditSectionTokens( $popts->getEditSection() );
+ $wikiPage = method_exists( $article, 'getPage' )
+ ? $article->getPage()
+ : $article;
+
if ( !$useOutdated && $value->expired( $touched ) ) {
- wfIncrStats( "pcache_miss_expired" );
+ wfIncrStats( "pcache.miss.expired" );
$cacheTime = $value->getCacheTime();
wfDebug( "ParserOutput key expired, touched $touched, "
. "epoch $wgCacheEpoch, cached $cacheTime\n" );
$value = false;
} elseif ( $value->isDifferentRevision( $article->getLatest() ) ) {
- wfIncrStats( "pcache_miss_revid" );
+ wfIncrStats( "pcache.miss.revid" );
$revId = $article->getLatest();
$cachedRevId = $value->getCacheRevisionId();
wfDebug( "ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n" );
$value = false;
+ } elseif ( Hooks::run( 'RejectParserCacheValue', array( $value, $wikiPage, $popts ) ) === false ) {
+ wfIncrStats( 'pcache.miss.rejected' );
+ wfDebug( "ParserOutput key valid, but rejected by RejectParserCacheValue hook handler.\n" );
+ $value = false;
} else {
- wfIncrStats( "pcache_hit" );
+ wfIncrStats( "pcache.hit" );
}
return $value;