parsercache.php
来自「php 开发的内容管理系统」· PHP 代码 · 共 128 行
PHP
128 行
<?php/** * * @package MediaWiki * @subpackage Cache *//** * * @package MediaWiki */class ParserCache { /** * Get an instance of this object */ function &singleton() { static $instance; if ( !isset( $instance ) ) { global $parserMemc; $instance = new ParserCache( $parserMemc ); } return $instance; } /** * Setup a cache pathway with a given back-end storage mechanism. * May be a memcached client or a BagOStuff derivative. * * @param object $memCached */ function ParserCache( &$memCached ) { $this->mMemc =& $memCached; } function getKey( &$article, &$user ) { global $wgDBname, $action; $hash = $user->getPageRenderingHash(); if( !$article->mTitle->userCanEdit() ) { // section edit links are suppressed even if the user has them on $edit = '!edit=0'; } else { $edit = ''; } $pageid = intval( $article->getID() ); $renderkey = (int)($action == 'render'); $key = "$wgDBname: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 $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 = $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->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" ); } $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 $wgParserCacheExpireTime; $key = $this->getKey( $article, $user ); 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<!-- Saved in parser cache with key $key and timestamp $now -->\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 { wfDebug( "Parser output was marked as uncacheable and has not been saved.\n" ); } } }?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?