From: Mark A. Hershberger Date: Tue, 1 Nov 2011 16:10:44 +0000 (+0000) Subject: Apply Vitaliy Filippov's patch from Bug #29283 with some small style mods X-Git-Tag: 1.31.0-rc.0~26780 X-Git-Url: http://git.cyclocoop.org//%27%40script%40/%27?a=commitdiff_plain;h=461b7885d8149447096789755ad27541904c1408;p=lhc%2Fweb%2Fwiklou.git Apply Vitaliy Filippov's patch from Bug #29283 with some small style mods --- diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 2f072121db..5ac74a1f3b 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -127,6 +127,7 @@ $wgAutoloadLocalClasses = array( 'IndexPager' => 'includes/Pager.php', 'Interwiki' => 'includes/interwiki/Interwiki.php', 'IP' => 'includes/IP.php', + 'LCStore_Accel' => 'includes/LocalisationCache.php', 'LCStore_CDB' => 'includes/LocalisationCache.php', 'LCStore_DB' => 'includes/LocalisationCache.php', 'LCStore_Null' => 'includes/LocalisationCache.php', diff --git a/includes/LocalisationCache.php b/includes/LocalisationCache.php index f76ae11a37..098cacec23 100644 --- a/includes/LocalisationCache.php +++ b/includes/LocalisationCache.php @@ -159,8 +159,13 @@ class LocalisationCache { case 'db': $storeClass = 'LCStore_DB'; break; + case 'accel': case 'detect': - $storeClass = $wgCacheDirectory ? 'LCStore_CDB' : 'LCStore_DB'; + if ( !( wfGetCache( CACHE_ACCEL ) instanceof FakeMemCachedClient ) ) { + $storeClass = 'LCStore_Accel'; + } else { + $storeClass = $wgCacheDirectory ? 'LCStore_CDB' : 'LCStore_DB'; + } break; default: throw new MWException( @@ -348,7 +353,9 @@ class LocalisationCache { } $deps = $this->store->get( $code, 'deps' ); - if ( $deps === null ) { + $keys = $this->store->get( $code, 'list', 'messages' ); + // 'list:messages' sometimes expires separately of 'deps' in LCStore_Accel + if ( $deps === null || $keys === null ) { wfDebug( __METHOD__."($code): cache missing, need to make one\n" ); return true; } @@ -829,6 +836,54 @@ interface LCStore { function set( $key, $value ); } +/** + * LCStore implementation which uses PHP accelerator to store data. + * This will work if one of XCache, eAccelerator, 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 ); + return $this->cache->get( $k ); + } + + 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. @@ -1126,4 +1181,4 @@ class LocalisationCache_BulkLoad extends LocalisationCache { $this->unload( $code ); } } -} +} \ No newline at end of file