parent::__construct();
$this->addOption( 'list', 'List special page names' );
$this->addOption( 'only', 'Only update "page"; case sensitive, ' .
- 'check correct case by calling this script with --list or on ' .
- 'includes/QueryPage.php. Ex: --only=BrokenRedirects', false, true );
+ 'check correct case by calling this script with --list. ' .
+ 'Ex: --only=BrokenRedirects', false, true );
$this->addOption( 'override', 'Also update pages that have updates disabled' );
}
public function execute() {
global $wgQueryCacheLimit, $wgDisableQueryPageUpdate;
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = $this->getDB( DB_MASTER );
$this->doSpecialPageCacheUpdates( $dbw );
if ( $specialObj instanceof QueryPage ) {
$queryPage = $specialObj;
} else {
- if ( !class_exists( $class ) ) {
- $file = $specialObj->getFile();
- require_once $file;
- }
- $queryPage = new $class;
+ $class = get_class( $specialObj );
+ $this->fatalError( "$class is not an instance of QueryPage.\n" );
+ die;
}
if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
$this->output( sprintf( '%-30s [QueryPage] ', $special ) );
if ( $queryPage->isExpensive() ) {
- $t1 = explode( ' ', microtime() );
+ $t1 = microtime( true );
# Do the query
$num = $queryPage->recache( $limit === null ? $wgQueryCacheLimit : $limit );
- $t2 = explode( ' ', microtime() );
+ $t2 = microtime( true );
if ( $num === false ) {
$this->output( "FAILED: database error\n" );
} else {
$this->output( "got $num rows in " );
- $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
+ $elapsed = $t2 - $t1;
$hours = intval( $elapsed / 3600 );
$minutes = intval( $elapsed % 3600 / 60 );
$seconds = $elapsed - $hours * 3600 - $minutes * 60;
$this->output( sprintf( "%.2fs\n", $seconds ) );
}
# Reopen any connections that have closed
- if ( !wfGetLB()->pingAll() ) {
- $this->output( "\n" );
- do {
- $this->error( "Connection failed, reconnecting in 10 seconds..." );
- sleep( 10 );
- } while ( !wfGetLB()->pingAll() );
- $this->output( "Reconnected\n\n" );
- }
- # Wait for the slave to catch up
- wfWaitForSlaves();
+ $this->reopenAndWaitForReplicas();
} else {
$this->output( "cheap, skipped\n" );
}
}
}
+ /**
+ * Re-open any closed db connection, and wait for replicas
+ *
+ * Queries that take a really long time, might cause the
+ * mysql connection to "go away"
+ */
+ private function reopenAndWaitForReplicas() {
+ if ( !wfGetLB()->pingAll() ) {
+ $this->output( "\n" );
+ do {
+ $this->error( "Connection failed, reconnecting in 10 seconds..." );
+ sleep( 10 );
+ } while ( !wfGetLB()->pingAll() );
+ $this->output( "Reconnected\n\n" );
+ }
+ # Wait for the replica DB to catch up
+ wfWaitForSlaves();
+ }
+
public function doSpecialPageCacheUpdates( $dbw ) {
global $wgSpecialPageCacheUpdates;
continue;
}
$this->output( sprintf( '%-30s [callback] ', $special ) );
- $t1 = explode( ' ', microtime() );
+ $t1 = microtime( true );
call_user_func( $call, $dbw );
- $t2 = explode( ' ', microtime() );
+ $t2 = microtime( true );
$this->output( "completed in " );
- $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
+ $elapsed = $t2 - $t1;
$hours = intval( $elapsed / 3600 );
$minutes = intval( $elapsed % 3600 / 60 );
$seconds = $elapsed - $hours * 3600 - $minutes * 60;
$this->output( $minutes . 'm ' );
}
$this->output( sprintf( "%.2fs\n", $seconds ) );
- # Wait for the slave to catch up
- wfWaitForSlaves();
+ # Wait for the replica DB to catch up
+ $this->reopenAndWaitForReplicas();
}
}
}
}
-$maintClass = "UpdateSpecialPages";
+$maintClass = UpdateSpecialPages::class;
require_once RUN_MAINTENANCE_IF_MAIN;