diff options
Diffstat (limited to 'maintenance/rebuildFileCache.php')
-rw-r--r-- | maintenance/rebuildFileCache.php | 179 |
1 files changed, 106 insertions, 73 deletions
diff --git a/maintenance/rebuildFileCache.php b/maintenance/rebuildFileCache.php index 8c01b90f..2a4e4884 100644 --- a/maintenance/rebuildFileCache.php +++ b/maintenance/rebuildFileCache.php @@ -2,91 +2,124 @@ /** * Build file cache for content pages * - * @file + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * * @ingroup Maintenance */ -/** */ -require_once( "commandLine.inc" ); -if( !$wgUseFileCache ) { - echo "Nothing to do -- \$wgUseFileCache is disabled.\n"; - exit(0); -} -$wgDisableCounters = false; // no real hits here +require_once( dirname(__FILE__) . '/Maintenance.php' ); -$start = isset($args[0]) ? intval($args[0]) : 0; -$overwrite = isset( $args[1] ) && $args[1] === 'overwrite'; -echo "Building content page file cache from page {$start}!\n"; -echo "Format: <start> [overwrite]\n"; +class RebuildFileCache extends Maintenance { + public function __construct() { + parent::__construct(); + $this->mDescription = "Build file cache for content pages"; + $this->addArg( 'start', 'Page_id to start from', true ); + $this->addArg( 'overwrite', 'Refresh page cache', false ); + $this->setBatchSize( 100 ); + } -$dbr = wfGetDB( DB_SLAVE ); -$start = $start > 0 ? $start : $dbr->selectField( 'page', 'MIN(page_id)', false, __FUNCTION__ ); -$end = $dbr->selectField( 'page', 'MAX(page_id)', false, __FUNCTION__ ); -if( !$start ) { - die("Nothing to do.\n"); -} + public function execute() { + global $wgUseFileCache, $wgDisableCounters, $wgContentNamespaces; + global $wgTitle, $wgArticle, $wgOut, $wgUser; + if( !$wgUseFileCache ) { + $this->error( "Nothing to do -- \$wgUseFileCache is disabled.", true ); + } + $wgDisableCounters = false; + $start = $this->getArg( 0, "0" ); + if( !ctype_digit($start) ) { + $this->error( "Invalid value for start parameter.", true ); + } + $start = intval($start); + $overwrite = $this->hasArg(1) && $this->getArg(1) === 'overwrite'; + $this->output( "Building content page file cache from page {$start}!\n" ); -$_SERVER['HTTP_ACCEPT_ENCODING'] = 'bgzip'; // hack, no real client -OutputPage::setEncodings(); # Not really used yet + $dbr = wfGetDB( DB_SLAVE ); + $start = $start > 0 ? $start : $dbr->selectField( 'page', 'MIN(page_id)', false, __FUNCTION__ ); + $end = $dbr->selectField( 'page', 'MAX(page_id)', false, __FUNCTION__ ); + if( !$start ) { + $this->error( "Nothing to do.", true ); + } -$BATCH_SIZE = 100; -# Do remaining chunk -$end += $BATCH_SIZE - 1; -$blockStart = $start; -$blockEnd = $start + $BATCH_SIZE - 1; + $_SERVER['HTTP_ACCEPT_ENCODING'] = 'bgzip'; // hack, no real client + OutputPage::setEncodings(); # Not really used yet -$dbw = wfGetDB( DB_MASTER ); -// Go through each page and save the output -while( $blockEnd <= $end ) { - // Get the pages - $res = $dbr->select( 'page', array('page_namespace','page_title','page_id'), - array('page_namespace' => $wgContentNamespaces, - "page_id BETWEEN $blockStart AND $blockEnd" ), - array('ORDER BY' => 'page_id ASC','USE INDEX' => 'PRIMARY') - ); - while( $row = $dbr->fetchObject( $res ) ) { - $rebuilt = false; - $wgTitle = Title::makeTitleSafe( $row->page_namespace, $row->page_title ); - if( null == $wgTitle ) { - echo "Page {$row->page_id} bad title\n"; - continue; // broken title? - } - $wgArticle = new Article( $wgTitle ); - // If the article is cacheable, then load it - if( $wgArticle->isFileCacheable() ) { - $cache = new HTMLFileCache( $wgTitle ); - if( $cache->isFileCacheGood() ) { - if( $overwrite ) { - $rebuilt = true; + # Do remaining chunk + $end += $this->mBatchSize - 1; + $blockStart = $start; + $blockEnd = $start + $this->mBatchSize - 1; + + $dbw = wfGetDB( DB_MASTER ); + // Go through each page and save the output + while( $blockEnd <= $end ) { + // Get the pages + $res = $dbr->select( 'page', array('page_namespace','page_title','page_id'), + array('page_namespace' => $wgContentNamespaces, + "page_id BETWEEN $blockStart AND $blockEnd" ), + array('ORDER BY' => 'page_id ASC','USE INDEX' => 'PRIMARY') + ); + foreach( $res as $row ) { + $rebuilt = false; + $wgTitle = Title::makeTitleSafe( $row->page_namespace, $row->page_title ); + if( null == $wgTitle ) { + $this->output( "Page {$row->page_id} has bad title\n" ); + continue; // broken title? + } + $wgOut->setTitle( $wgTitle ); // set display title + $wgUser->getSkin( $wgTitle ); // set skin title + $wgArticle = new Article( $wgTitle ); + // If the article is cacheable, then load it + if( $wgArticle->isFileCacheable() ) { + $cache = new HTMLFileCache( $wgTitle ); + if( $cache->isFileCacheGood() ) { + if( $overwrite ) { + $rebuilt = true; + } else { + $this->output( "Page {$row->page_id} already cached\n" ); + continue; // done already! + } + } + ob_start( array(&$cache, 'saveToFileCache' ) ); // save on ob_end_clean() + $wgUseFileCache = false; // hack, we don't want $wgArticle fiddling with filecache + $wgArticle->view(); + @$wgOut->output(); // header notices + $wgUseFileCache = true; + ob_end_clean(); // clear buffer + $wgOut = new OutputPage(); // empty out any output page garbage + if( $rebuilt ) + $this->output( "Re-cached page {$row->page_id}\n" ); + else + $this->output( "Cached page {$row->page_id}\n" ); } else { - echo "Page {$row->page_id} already cached\n"; - continue; // done already! + $this->output( "Page {$row->page_id} not cacheable\n" ); } + $dbw->commit(); // commit any changes } - ob_start( array(&$cache, 'saveToFileCache' ) ); // save on ob_end_clean() - $wgUseFileCache = false; // hack, we don't want $wgArticle fiddling with filecache - $wgArticle->view(); - @$wgOut->output(); // header notices - $wgUseFileCache = true; - ob_end_clean(); // clear buffer - $wgOut = new OutputPage(); // empty out any output page garbage - if( $rebuilt ) - echo "Re-cached page {$row->page_id}\n"; - else - echo "Cached page {$row->page_id}\n"; - } else { - echo "Page {$row->page_id} not cacheable\n"; + $blockStart += $this->mBatchSize; + $blockEnd += $this->mBatchSize; + wfWaitForSlaves( 5 ); } - $dbw->commit(); // commit any changes + $this->output( "Done!\n" ); + + // Remove these to be safe + if( isset($wgTitle) ) + unset($wgTitle); + if( isset($wgArticle) ) + unset($wgArticle); } - $blockStart += $BATCH_SIZE; - $blockEnd += $BATCH_SIZE; - wfWaitForSlaves( 5 ); } -echo "Done!\n"; -// Remove these to be safe -if( isset($wgTitle) ) - unset($wgTitle); -if( isset($wgArticle) ) - unset($wgArticle); +$maintClass = "RebuildFileCache"; +require_once( DO_MAINTENANCE ); |