X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FParserCache.php;h=129b713213017f0a0f1eb06851ed3388a35a4c52;hb=2cdff4cf67b77a3a7bb54c656a05bfe8a529ae3d;hp=cbd33f7622b49d41e8756bdf84b2e0860fb519ba;hpb=97dc6c150ce8857e8acd5d0f27a08e760c3ce42b;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/ParserCache.php b/includes/ParserCache.php index cbd33f7622..129b713213 100644 --- a/includes/ParserCache.php +++ b/includes/ParserCache.php @@ -1,73 +1,119 @@ mMemc =& $memCached; + } -/** - * - * @package MediaWiki - */ -class ParserCache -{ function getKey( &$article, &$user ) { - global $wgDBname; + global $action; $hash = $user->getPageRenderingHash(); + if( !$article->mTitle->quickUserCan( 'edit' ) ) { + // section edit links are suppressed even if the user has them on + $edit = '!edit=0'; + } else { + $edit = ''; + } $pageid = intval( $article->getID() ); - $key = "$wgDBname:pcache:idhash:$pageid-$hash"; + $renderkey = (int)($action == 'render'); + $key = wfMemcKey( 'pcache', 'idhash', "$pageid-$renderkey!$hash$edit" ); return $key; } - + + function getETag( &$article, &$user ) { + return 'W/"' . $this->getKey($article, $user) . "--" . $article->mTouched. '"'; + } + function get( &$article, &$user ) { - global $wgMemc, $wgCacheEpoch; + global $wgCacheEpoch; $fname = 'ParserCache::get'; wfProfileIn( $fname ); - $hash = $user->getPageRenderingHash(); - $pageid = intval( $article->getID() ); $key = $this->getKey( $article, $user ); + wfDebug( "Trying parser cache $key\n" ); - $value = $wgMemc->get( $key ); + $value = $this->mMemc->get( $key ); if ( is_object( $value ) ) { wfDebug( "Found.\n" ); # Delete if article has changed since the cache was made $canCache = $article->checkTouched(); $cacheTime = $value->getCacheTime(); $touched = $article->mTouched; - if ( !$canCache || $value->getCacheTime() <= $touched || $cacheTime < $wgCacheEpoch ) { + if ( !$canCache || $value->expired( $touched ) ) { if ( !$canCache ) { + wfIncrStats( "pcache_miss_invalid" ); wfDebug( "Invalid cached redirect, touched $touched, epoch $wgCacheEpoch, cached $cacheTime\n" ); } else { + wfIncrStats( "pcache_miss_expired" ); wfDebug( "Key expired, touched $touched, epoch $wgCacheEpoch, cached $cacheTime\n" ); } - $wgMemc->delete( $key ); + $this->mMemc->delete( $key ); $value = false; + } else { + if ( isset( $value->mTimestamp ) ) { + $article->mTimestamp = $value->mTimestamp; + } + wfIncrStats( "pcache_hit" ); } } else { + wfDebug( "Parser cache miss.\n" ); + wfIncrStats( "pcache_miss_absent" ); $value = false; } wfProfileOut( $fname ); return $value; } - - function save( $parserOutput, &$article, &$user ){ - global $wgMemc; + function save( $parserOutput, &$article, &$user ){ + global $wgParserCacheExpireTime; $key = $this->getKey( $article, $user ); - $now = wfTimestampNow(); - $parserOutput->setCacheTime( $now ); - $parserOutput->mText .= "\n\n"; - if( $parserOutput->containsOldMagic() ){ - $expire = 3600; # 1 hour + if( $parserOutput->getCacheTime() != -1 ) { + + $now = wfTimestampNow(); + $parserOutput->setCacheTime( $now ); + + // Save the timestamp so that we don't have to load the revision row on view + $parserOutput->mTimestamp = $article->getTimestamp(); + + $parserOutput->mText .= "\n\n"; + wfDebug( "Saved in parser cache with key $key and timestamp $now\n" ); + + if( $parserOutput->containsOldMagic() ){ + $expire = 3600; # 1 hour + } else { + $expire = $wgParserCacheExpireTime; + } + $this->mMemc->set( $key, $parserOutput, $expire ); + } else { - $expire = 86400; # 1 day + wfDebug( "Parser output was marked as uncacheable and has not been saved.\n" ); } - - $wgMemc->set( $key, $parserOutput, $expire ); } + } -?>