messagecache.php

来自「php 开发的内容管理系统」· PHP 代码 · 共 582 行 · 第 1/2 页

PHP
582
字号
		}		$conditions = array( 'page_is_redirect' => 0,					'page_namespace' => NS_MEDIAWIKI);		$res = $dbr->select( array( 'page', 'revision', 'text' ),			array( 'page_title', 'old_text', 'old_flags' ),			'page_is_redirect=0 AND page_namespace='.NS_MEDIAWIKI.' AND page_latest=rev_id AND rev_text_id=old_id',			$fname		);		$this->mCache = array();		for ( $row = $dbr->fetchObject( $res ); $row; $row = $dbr->fetchObject( $res ) ) {			$this->mCache[$row->page_title] = Revision::getRevisionText( $row );		}		# Negative caching		# Go through the language array and the extension array and make a note of		# any keys missing from the cache		foreach ( $wgAllMessagesEn as $key => $value ) {			$uckey = $wgLang->ucfirst( $key );			if ( !array_key_exists( $uckey, $this->mCache ) ) {				$this->mCache[$uckey] = false;			}		}		# Make sure all extension messages are available		wfLoadAllExtensions();		# Add them to the cache		foreach ( $this->mExtensionMessages as $key => $value ) {			$uckey = $wgLang->ucfirst( $key );			if ( !array_key_exists( $uckey, $this->mCache ) &&			 ( isset( $this->mExtensionMessages[$key][$wgLang->getCode()] ) || isset( $this->mExtensionMessages[$key]['en'] ) )  ) {				$this->mCache[$uckey] = false;			}		}		$dbr->freeResult( $res );	}	/**	 * Not really needed anymore	 */	function getKeys() {		global $wgAllMessagesEn, $wgContLang;		if ( !$this->mKeys ) {			$this->mKeys = array();			foreach ( $wgAllMessagesEn as $key => $value ) {				$title = $wgContLang->ucfirst( $key );				array_push( $this->mKeys, $title );			}		}		return $this->mKeys;	}	/**	 * @deprecated	 */	function isCacheable( $key ) {		return true;	}	function replace( $title, $text ) {		global $wgLocalMessageCache, $wgLocalMessageCacheSerialized, $parserMemc, $wgDBname;		$this->lock();		$this->load();		$parserMemc->delete("$wgDBname:sidebar");		if ( is_array( $this->mCache ) ) {			$this->mCache[$title] = $text;			$this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry );			# Save to local cache			if ( $wgLocalMessageCache !== false ) {				$serialized = serialize( $this->mCache );				$hash = md5( $serialized );				$this->mMemc->set( "{$this->mMemcKey}-hash", $hash, $this->mExpiry );				if ($wgLocalMessageCacheSerialized) {					$this->saveToLocal( $serialized,$hash );				} else {					$this->saveToScript( $this->mCache, $hash );				}			}		}		$this->unlock();	}	/**	 * Returns success	 * Represents a write lock on the messages key	 */	function lock() {		if ( !$this->mUseCache ) {			return true;		}		$lockKey = $this->mMemcKey . 'lock';		for ($i=0; $i < MSG_WAIT_TIMEOUT && !$this->mMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT ); $i++ ) {			sleep(1);		}		return $i >= MSG_WAIT_TIMEOUT;	}	function unlock() {		if ( !$this->mUseCache ) {			return;		}		$lockKey = $this->mMemcKey . 'lock';		$this->mMemc->delete( $lockKey );	}	function get( $key, $useDB, $forcontent=true, $isfullkey = false ) {		global $wgContLanguageCode;		if( $forcontent ) {			global $wgContLang;			$lang =& $wgContLang;			$langcode = $wgContLanguageCode;		} else {			global $wgLang, $wgLanguageCode;			$lang =& $wgLang;			$langcode = $wgLanguageCode;		}		# If uninitialised, someone is trying to call this halfway through Setup.php		if( !$this->mInitialised ) {			return '&lt;' . htmlspecialchars($key) . '&gt;';		}		# If cache initialization was deferred, start it now.		if( $this->mDeferred && !$this->mDisable && $useDB ) {			$this->load();		}		$message = false;		if( !$this->mDisable && $useDB ) {			$title = $lang->ucfirst( $key );			if(!$isfullkey && ($langcode != $wgContLanguageCode) ) {				$title .= '/' . $langcode;			}			$message = $this->getFromCache( $title );		}		# Try the extension array		if( $message === false && array_key_exists( $key, $this->mExtensionMessages ) ) {			if ( isset( $this->mExtensionMessages[$key][$langcode] ) ) {				$message = $this->mExtensionMessages[$key][$langcode];			} elseif ( isset( $this->mExtensionMessages[$key]['en'] ) ) {				$message = $this->mExtensionMessages[$key]['en'];			}		}		# Try the array in the language object		if( $message === false ) {			wfSuppressWarnings();			$message = $lang->getMessage( $key );			wfRestoreWarnings();			if ( is_null( $message ) ) {				$message = false;			}		}		# Try the English array		if( $message === false && $langcode != 'en' ) {			wfSuppressWarnings();			$message = Language::getMessage( $key );			wfRestoreWarnings();			if ( is_null( $message ) ) {				$message = false;			}		}		# Is this a custom message? Try the default language in the db...		if( ($message === false || $message === '-' ) &&			!$this->mDisable && $useDB &&			!$isfullkey && ($langcode != $wgContLanguageCode) ) {			$message = $this->getFromCache( $lang->ucfirst( $key ) );		}		# Final fallback		if( $message === false ) {			return '&lt;' . htmlspecialchars($key) . '&gt;';		}		# Replace brace tags		$message = $this->transform( $message );		return $message;	}	function getFromCache( $title ) {		$message = false;		# Try the cache		if( $this->mUseCache && is_array( $this->mCache ) && array_key_exists( $title, $this->mCache ) ) {			return $this->mCache[$title];		}		# Try individual message cache		if ( $this->mUseCache ) {			$message = $this->mMemc->get( $this->mMemcKey . ':' . $title );			if ( $message == '###NONEXISTENT###' ) {				return false;			} elseif( !is_null( $message ) ) {				$this->mCache[$title] = $message;				return $message;			} else {				$message = false;			}		}		# Call message Hooks, in case they are defined		wfRunHooks('MessagesPreLoad',array($title,&$message));		# If it wasn't in the cache, load each message from the DB individually		$revision = Revision::newFromTitle( Title::makeTitle( NS_MEDIAWIKI, $title ) );		if( $revision ) {			$message = $revision->getText();			if ($this->mUseCache) {				$this->mCache[$title]=$message;				/* individual messages may be often				   recached until proper purge code exists				*/				$this->mMemc->set( $this->mMemcKey . ':' . $title, $message, 300 );			}		} else {			# Negative caching			# Use some special text instead of false, because false gets converted to '' somewhere			$this->mMemc->set( $this->mMemcKey . ':' . $title, '###NONEXISTENT###', $this->mExpiry );		}		return $message;	}	function transform( $message ) {		global $wgParser;		if ( !$this->mParser && isset( $wgParser ) ) {			# Do some initialisation so that we don't have to do it twice			$wgParser->firstCallInit();			# Clone it and store it			$this->mParser = clone $wgParser;		}		if ( !$this->mDisableTransform && $this->mParser ) {			if( strpos( $message, '{{' ) !== false ) {				$message = $this->mParser->transformMsg( $message, $this->mParserOptions );			}		}		return $message;	}	function disable() { $this->mDisable = true; }	function enable() { $this->mDisable = false; }	function disableTransform() { $this->mDisableTransform = true; }	function enableTransform() { $this->mDisableTransform = false; }	function setTransform( $x ) { $this->mDisableTransform = $x; }	function getTransform() { return $this->mDisableTransform; }	/**	 * Add a message to the cache	 *	 * @param mixed $key	 * @param mixed $value	 * @param string $lang The messages language, English by default	 */	function addMessage( $key, $value, $lang = 'en' ) {		$this->mExtensionMessages[$key][$lang] = $value;	}	/**	 * Add an associative array of message to the cache	 *	 * @param array $messages An associative array of key => values to be added	 * @param string $lang The messages language, English by default	 */	function addMessages( $messages, $lang = 'en' ) {		wfProfileIn( __METHOD__ );		foreach ( $messages as $key => $value ) {			$this->addMessage( $key, $value, $lang );		}		wfProfileOut( __METHOD__ );	}	/**	 * Clear all stored messages. Mainly used after a mass rebuild.	 */	function clear() {		if( $this->mUseCache ) {			$this->mMemc->delete( $this->mMemcKey );		}	}}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?