X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FLocalisationCache.php;h=9ce26d000be567dd63f3dab3bc543725774dd276;hb=a461e48eec690d73e182bebd1874fd261ebc429b;hp=d451dc2f5d2aba8a0adb164fe069974ac4749903;hpb=3dfb64f9d779d92a4a0c615be7336c591ad91979;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/LocalisationCache.php b/includes/LocalisationCache.php index d451dc2f5d..9ce26d000b 100644 --- a/includes/LocalisationCache.php +++ b/includes/LocalisationCache.php @@ -1,4 +1,24 @@ mergeableKeys ) ) { + if ( $this->mergeableKeys === null ) { $this->mergeableKeys = array_flip( array_merge( self::$mergeableMapKeys, self::$mergeableListKeys, @@ -198,6 +228,9 @@ class LocalisationCache { * * Warning: this may be slow for split items (messages), since it will * need to fetch all of the subitems from the cache individually. + * @param $code + * @param $key + * @return mixed */ public function getItem( $code, $key ) { if ( !isset( $this->loadedItems[$code][$key] ) ) { @@ -215,11 +248,14 @@ class LocalisationCache { /** * Get a subitem, for instance a single message for a given language. + * @param $code + * @param $key + * @param $subkey + * @return null */ public function getSubitem( $code, $key, $subkey ) { - if ( !isset( $this->loadedSubitems[$code][$key][$subkey] ) - && !isset( $this->loadedItems[$code][$key] ) ) - { + if ( !isset( $this->loadedSubitems[$code][$key][$subkey] ) && + !isset( $this->loadedItems[$code][$key] ) ) { wfProfileIn( __METHOD__.'-load' ); $this->loadSubitem( $code, $key, $subkey ); wfProfileOut( __METHOD__.'-load' ); @@ -240,6 +276,9 @@ class LocalisationCache { * * Will return null if the item is not found, or false if the item is not an * array. + * @param $code + * @param $key + * @return bool|null|string */ public function getSubitemList( $code, $key ) { if ( in_array( $key, self::$splitKeys ) ) { @@ -256,6 +295,8 @@ class LocalisationCache { /** * Load an item into the cache. + * @param $code + * @param $key */ protected function loadItem( $code, $key ) { if ( !isset( $this->initialisedLangs[$code] ) ) { @@ -289,6 +330,10 @@ class LocalisationCache { /** * Load a subitem into the cache + * @param $code + * @param $key + * @param $subkey + * @return */ protected function loadSubitem( $code, $key, $subkey ) { if ( !in_array( $key, self::$splitKeys ) ) { @@ -301,9 +346,8 @@ class LocalisationCache { } // Check to see if initLanguage() loaded it for us - if ( isset( $this->loadedItems[$code][$key] ) - || isset( $this->loadedSubitems[$code][$key][$subkey] ) ) - { + if ( isset( $this->loadedItems[$code][$key] ) || + isset( $this->loadedSubitems[$code][$key][$subkey] ) ) { return; } @@ -319,6 +363,7 @@ class LocalisationCache { /** * Returns true if the cache identified by $code is missing or expired. + * @return bool */ public function isExpired( $code ) { if ( $this->forceRecache && !isset( $this->recachedLangs[$code] ) ) { @@ -327,7 +372,10 @@ class LocalisationCache { } $deps = $this->store->get( $code, 'deps' ); - if ( $deps === null ) { + $keys = $this->store->get( $code, 'list', 'messages' ); + $preload = $this->store->get( $code, 'preload' ); + // Different keys may expire separately, at least in LCStore_Accel + if ( $deps === null || $keys === null || $preload === null ) { wfDebug( __METHOD__."($code): cache missing, need to make one\n" ); return true; } @@ -349,6 +397,7 @@ class LocalisationCache { /** * Initialise a language in this object. Rebuild the cache if necessary. + * @param $code */ protected function initLanguage( $code ) { if ( isset( $this->initialisedLangs[$code] ) ) { @@ -405,6 +454,8 @@ class LocalisationCache { /** * Create a fallback from one language to another, without creating a * complete persistent cache. + * @param $primaryCode + * @param $fallbackCode */ public function initShallowFallback( $primaryCode, $fallbackCode ) { $this->data[$primaryCode] =& $this->data[$fallbackCode]; @@ -415,6 +466,9 @@ class LocalisationCache { /** * Read a PHP file containing localisation data. + * @param $_fileName + * @param $_fileType + * @return array */ protected function readPHPFile( $_fileName, $_fileType ) { // Disable APC caching @@ -436,6 +490,9 @@ class LocalisationCache { /** * Merge two localisation values, a primary and a fallback, overwriting the * primary value in place. + * @param $key + * @param $value + * @param $fallbackValue */ protected function mergeItem( $key, &$value, $fallbackValue ) { if ( !is_null( $value ) ) { @@ -463,6 +520,10 @@ class LocalisationCache { } } + /** + * @param $value + * @param $fallbackValue + */ protected function mergeMagicWords( &$value, $fallbackValue ) { foreach ( $fallbackValue as $magicName => $fallbackInfo ) { if ( !isset( $value[$magicName] ) ) { @@ -484,6 +545,11 @@ class LocalisationCache { * * Returns true if any data from the extension array was used, false * otherwise. + * @param $codeSequence + * @param $key + * @param $value + * @param $fallbackValue + * @return bool */ protected function mergeExtensionItem( $codeSequence, $key, &$value, $fallbackValue ) { $used = false; @@ -500,9 +566,10 @@ class LocalisationCache { /** * Load localisation data for a given language for both core and extensions * and save it to the persistent cache store and the process cache + * @param $code */ public function recache( $code ) { - global $wgExtensionMessagesFiles, $wgExtensionAliasesFiles; + global $wgExtensionMessagesFiles; wfProfileIn( __METHOD__ ); if ( !$code ) { @@ -597,22 +664,6 @@ class LocalisationCache { } } - # Load deprecated $wgExtensionAliasesFiles - foreach ( $wgExtensionAliasesFiles as $fileName ) { - $data = $this->readPHPFile( $fileName, 'aliases' ); - - if ( !isset( $data['aliases'] ) ) { - continue; - } - - $used = $this->mergeExtensionItem( $codeSequence, 'specialPageAliases', - $allData['specialPageAliases'], $data['aliases'] ); - - if ( $used ) { - $deps[] = new FileDependency( $fileName ); - } - } - # Merge core data into extension data foreach ( $coreData as $key => $item ) { $this->mergeItem( $key, $allData[$key], $item ); @@ -620,7 +671,6 @@ class LocalisationCache { # Add cache dependencies for any referenced globals $deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' ); - $deps['wgExtensionAliasesFiles'] = new GlobalDependency( 'wgExtensionAliasesFiles' ); $deps['version'] = new ConstantDependency( 'MW_LC_VERSION' ); # Add dependencies to the cache entry @@ -687,6 +737,8 @@ class LocalisationCache { * * The preload item will be loaded automatically, improving performance * for the commonly-requested items it contains. + * @param $data + * @return array */ protected function buildPreload( $data ) { $preload = array( 'messages' => array() ); @@ -709,6 +761,7 @@ class LocalisationCache { /** * Unload the data for a given language from the object cache. * Reduces memory usage. + * @param $code */ public function unload( $code ) { unset( $this->data[$code] ); @@ -761,8 +814,8 @@ class LocalisationCache { interface LCStore { /** * Get a value. - * @param $code Language code - * @param $key Cache key + * @param $code string Language code + * @param $key string Cache key */ function get( $code, $key ); @@ -780,10 +833,61 @@ interface LCStore { /** * Set a key to a given value. startWrite() must be called before this * is called, and finishWrite() must be called afterwards. + * @param $key + * @param $value */ function set( $key, $value ); } +/** + * LCStore implementation which uses PHP accelerator to store data. + * This will work if one of XCache, WinCache or APC cacher is configured. + * (See ObjectCache.php) + */ +class LCStore_Accel implements LCStore { + var $currentLang; + var $keys; + + public function __construct() { + $this->cache = wfGetCache( CACHE_ACCEL ); + } + + public function get( $code, $key ) { + $k = wfMemcKey( 'l10n', $code, 'k', $key ); + $r = $this->cache->get( $k ); + return $r === false ? null : $r; + } + + public function startWrite( $code ) { + $k = wfMemcKey( 'l10n', $code, 'l' ); + $keys = $this->cache->get( $k ); + if ( $keys ) { + foreach ( $keys as $k ) { + $this->cache->delete( $k ); + } + } + $this->currentLang = $code; + $this->keys = array(); + } + + public function finishWrite() { + if ( $this->currentLang ) { + $k = wfMemcKey( 'l10n', $this->currentLang, 'l' ); + $this->cache->set( $k, array_keys( $this->keys ) ); + } + $this->currentLang = null; + $this->keys = array(); + } + + public function set( $key, $value ) { + if ( $this->currentLang ) { + $k = wfMemcKey( 'l10n', $this->currentLang, 'k', $key ); + $this->keys[$k] = true; + $this->cache->set( $k, $value ); + } + } +} + /** * LCStore implementation which uses the standard DB functions to store data. * This will work on any MediaWiki installation. @@ -791,7 +895,12 @@ interface LCStore { class LCStore_DB implements LCStore { var $currentLang; var $writesDone = false; - var $dbw, $batch; + + /** + * @var DatabaseBase + */ + var $dbw; + var $batch; var $readOnly = false; public function get( $code, $key ) { @@ -820,12 +929,12 @@ class LCStore_DB implements LCStore { $this->dbw = wfGetDB( DB_MASTER ); try { - $this->dbw->begin(); + $this->dbw->begin( __METHOD__ ); $this->dbw->delete( 'l10n_cache', array( 'lc_lang' => $code ), __METHOD__ ); } catch ( DBQueryError $e ) { if ( $this->dbw->wasReadOnlyError() ) { $this->readOnly = true; - $this->dbw->rollback(); + $this->dbw->rollback( __METHOD__ ); $this->dbw->ignoreErrors( false ); return; } else { @@ -846,7 +955,7 @@ class LCStore_DB implements LCStore { $this->dbw->insert( 'l10n_cache', $this->batch, __METHOD__ ); } - $this->dbw->commit(); + $this->dbw->commit( __METHOD__ ); $this->currentLang = null; $this->dbw = null; $this->batch = array(); @@ -998,6 +1107,11 @@ class LocalisationCache_BulkLoad extends LocalisationCache { */ var $maxLoadedLangs = 10; + /** + * @param $fileName + * @param $fileType + * @return array|mixed + */ protected function readPHPFile( $fileName, $fileType ) { $serialize = $fileType === 'core'; if ( !isset( $this->fileCache[$fileName][$fileType] ) ) { @@ -1019,18 +1133,32 @@ class LocalisationCache_BulkLoad extends LocalisationCache { } } + /** + * @param $code + * @param $key + * @return mixed + */ public function getItem( $code, $key ) { unset( $this->mruLangs[$code] ); $this->mruLangs[$code] = true; return parent::getItem( $code, $key ); } + /** + * @param $code + * @param $key + * @param $subkey + * @return + */ public function getSubitem( $code, $key, $subkey ) { unset( $this->mruLangs[$code] ); $this->mruLangs[$code] = true; return parent::getSubitem( $code, $key, $subkey ); } + /** + * @param $code + */ public function recache( $code ) { parent::recache( $code ); unset( $this->mruLangs[$code] ); @@ -1038,6 +1166,9 @@ class LocalisationCache_BulkLoad extends LocalisationCache { $this->trimCache(); } + /** + * @param $code + */ public function unload( $code ) { unset( $this->mruLangs[$code] ); parent::unload( $code );