[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 3 /** 4 * Rebuild the localisation cache. Useful if you disabled automatic updates 5 * using $wgLocalisationCacheConf['manualRecache'] = true; 6 * 7 * Usage: 8 * php rebuildLocalisationCache.php [--force] [--threads=N] 9 * 10 * Use --force to rebuild all files, even the ones that are not out of date. 11 * Use --threads=N to fork more threads. 12 * 13 * This program is free software; you can redistribute it and/or modify 14 * it under the terms of the GNU General Public License as published by 15 * the Free Software Foundation; either version 2 of the License, or 16 * (at your option) any later version. 17 * 18 * This program is distributed in the hope that it will be useful, 19 * but WITHOUT ANY WARRANTY; without even the implied warranty of 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21 * GNU General Public License for more details. 22 * 23 * You should have received a copy of the GNU General Public License along 24 * with this program; if not, write to the Free Software Foundation, Inc., 25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 26 * http://www.gnu.org/copyleft/gpl.html 27 * 28 * @file 29 * @ingroup Maintenance 30 */ 31 32 require_once __DIR__ . '/Maintenance.php'; 33 34 /** 35 * Maintenance script to rebuild the localisation cache. 36 * 37 * @ingroup Maintenance 38 */ 39 class RebuildLocalisationCache extends Maintenance { 40 public function __construct() { 41 parent::__construct(); 42 $this->mDescription = "Rebuild the localisation cache"; 43 $this->addOption( 'force', 'Rebuild all files, even ones not out of date' ); 44 $this->addOption( 'threads', 'Fork more than one thread', false, true ); 45 $this->addOption( 'outdir', 'Override the output directory (normally $wgCacheDirectory)', 46 false, true ); 47 $this->addOption( 'lang', 'Only rebuild these languages, comma separated.', 48 false, true ); 49 } 50 51 public function memoryLimit() { 52 if ( $this->hasOption( 'memory-limit' ) ) { 53 return parent::memoryLimit(); 54 } 55 56 return '1000M'; 57 } 58 59 public function finalSetup() { 60 # This script needs to be run to build the inital l10n cache. But if 61 # $wgLanguageCode is not 'en', it won't be able to run because there is 62 # no l10n cache. Break the cycle by forcing $wgLanguageCode = 'en'. 63 global $wgLanguageCode; 64 $wgLanguageCode = 'en'; 65 parent::finalSetup(); 66 } 67 68 public function execute() { 69 global $wgLocalisationCacheConf; 70 71 $force = $this->hasOption( 'force' ); 72 $threads = $this->getOption( 'threads', 1 ); 73 if ( $threads < 1 || $threads != intval( $threads ) ) { 74 $this->output( "Invalid thread count specified; running single-threaded.\n" ); 75 $threads = 1; 76 } 77 if ( $threads > 1 && wfIsWindows() ) { 78 $this->output( "Threaded rebuild is not supported on Windows; running single-threaded.\n" ); 79 $threads = 1; 80 } 81 if ( $threads > 1 && !function_exists( 'pcntl_fork' ) ) { 82 $this->output( "PHP pcntl extension is not present; running single-threaded.\n" ); 83 $threads = 1; 84 } 85 86 $conf = $wgLocalisationCacheConf; 87 $conf['manualRecache'] = false; // Allow fallbacks to create CDB files 88 if ( $force ) { 89 $conf['forceRecache'] = true; 90 } 91 if ( $this->hasOption( 'outdir' ) ) { 92 $conf['storeDirectory'] = $this->getOption( 'outdir' ); 93 } 94 $lc = new LocalisationCacheBulkLoad( $conf ); 95 96 $allCodes = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) ); 97 if ( $this->hasOption( 'lang' ) ) { 98 # Validate requested languages 99 $codes = array_intersect( $allCodes, 100 explode( ',', $this->getOption( 'lang' ) ) ); 101 # Bailed out if nothing is left 102 if ( count( $codes ) == 0 ) { 103 $this->error( 'None of the languages specified exists.', 1 ); 104 } 105 } else { 106 # By default get all languages 107 $codes = $allCodes; 108 } 109 sort( $codes ); 110 111 // Initialise and split into chunks 112 $numRebuilt = 0; 113 $total = count( $codes ); 114 $chunks = array_chunk( $codes, ceil( count( $codes ) / $threads ) ); 115 $pids = array(); 116 foreach ( $chunks as $codes ) { 117 // Do not fork for only one thread 118 $pid = ( $threads > 1 ) ? pcntl_fork() : -1; 119 120 if ( $pid === 0 ) { 121 // Child, reseed because there is no bug in PHP: 122 // http://bugs.php.net/bug.php?id=42465 123 mt_srand( getmypid() ); 124 $numRebuilt = $this->doRebuild( $codes, $lc, $force ); 125 // Abuse the exit value for the count of rebuild languages 126 exit( $numRebuilt ); 127 } elseif ( $pid === -1 ) { 128 // Fork failed or one thread, do it serialized 129 $numRebuilt += $this->doRebuild( $codes, $lc, $force ); 130 } else { 131 // Main thread 132 $pids[] = $pid; 133 } 134 } 135 // Wait for all children 136 foreach ( $pids as $pid ) { 137 $status = 0; 138 pcntl_waitpid( $pid, $status ); 139 // Fetch the count from the return value 140 $numRebuilt += pcntl_wexitstatus( $status ); 141 } 142 143 $this->output( "$numRebuilt languages rebuilt out of $total\n" ); 144 if ( $numRebuilt === 0 ) { 145 $this->output( "Use --force to rebuild the caches which are still fresh.\n" ); 146 } 147 } 148 149 /** 150 * Helper function to rebuild list of languages codes. Prints the code 151 * for each language which is rebuilt. 152 * @param array $codes List of language codes to rebuild. 153 * @param LocalisationCache $lc Instance of LocalisationCacheBulkLoad (?) 154 * @param bool $force Rebuild up-to-date languages 155 * @return int Number of rebuilt languages 156 */ 157 private function doRebuild( $codes, $lc, $force ) { 158 $numRebuilt = 0; 159 foreach ( $codes as $code ) { 160 if ( $force || $lc->isExpired( $code ) ) { 161 $this->output( "Rebuilding $code...\n" ); 162 $lc->recache( $code ); 163 $numRebuilt++; 164 } 165 } 166 167 return $numRebuilt; 168 } 169 170 /** 171 * Sets whether a run of this maintenance script has the force parameter set 172 * 173 * @param bool $forced 174 */ 175 public function setForce( $forced = true ) { 176 $this->mOptions['force'] = $forced; 177 } 178 } 179 180 $maintClass = "RebuildLocalisationCache"; 181 require_once RUN_MAINTENANCE_IF_MAIN;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |