[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/maintenance/ -> updateSpecialPages.php (source)

   1  <?php
   2  /**
   3   * Update for cached special pages.
   4   * Run this script periodically if you have miser mode enabled.
   5   *
   6   * This program is free software; you can redistribute it and/or modify
   7   * it under the terms of the GNU General Public License as published by
   8   * the Free Software Foundation; either version 2 of the License, or
   9   * (at your option) any later version.
  10   *
  11   * This program is distributed in the hope that it will be useful,
  12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14   * GNU General Public License for more details.
  15   *
  16   * You should have received a copy of the GNU General Public License along
  17   * with this program; if not, write to the Free Software Foundation, Inc.,
  18   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19   * http://www.gnu.org/copyleft/gpl.html
  20   *
  21   * @file
  22   * @ingroup Maintenance
  23   */
  24  
  25  require_once  __DIR__ . '/Maintenance.php';
  26  
  27  /**
  28   * Maintenance script to update cached special pages.
  29   *
  30   * @ingroup Maintenance
  31   */
  32  class UpdateSpecialPages extends Maintenance {
  33  	public function __construct() {
  34          parent::__construct();
  35          $this->addOption( 'list', 'List special page names' );
  36          $this->addOption( 'only', 'Only update "page"; case sensitive, ' .
  37              'check correct case by calling this script with --list. ' .
  38              'Ex: --only=BrokenRedirects', false, true );
  39          $this->addOption( 'override', 'Also update pages that have updates disabled' );
  40      }
  41  
  42  	public function execute() {
  43          global $wgQueryCacheLimit, $wgDisableQueryPageUpdate;
  44  
  45          $dbw = wfGetDB( DB_MASTER );
  46  
  47          $this->doSpecialPageCacheUpdates( $dbw );
  48  
  49          foreach ( QueryPage::getPages() as $page ) {
  50              list( $class, $special ) = $page;
  51              $limit = isset( $page[2] ) ? $page[2] : null;
  52  
  53              # --list : just show the name of pages
  54              if ( $this->hasOption( 'list' ) ) {
  55                  $this->output( "$special [QueryPage]\n" );
  56                  continue;
  57              }
  58  
  59              if ( !$this->hasOption( 'override' )
  60                  && $wgDisableQueryPageUpdate && in_array( $special, $wgDisableQueryPageUpdate )
  61              ) {
  62                  $this->output( sprintf( "%-30s [QueryPage] disabled\n", $special ) );
  63                  continue;
  64              }
  65  
  66              $specialObj = SpecialPageFactory::getPage( $special );
  67              if ( !$specialObj ) {
  68                  $this->output( "No such special page: $special\n" );
  69                  exit;
  70              }
  71              if ( $specialObj instanceof QueryPage ) {
  72                  $queryPage = $specialObj;
  73              } else {
  74                  if ( !class_exists( $class ) ) {
  75                      $file = $specialObj->getFile();
  76                      require_once $file;
  77                  }
  78                  $queryPage = new $class;
  79              }
  80  
  81              if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
  82                  $this->output( sprintf( '%-30s [QueryPage] ', $special ) );
  83                  if ( $queryPage->isExpensive() ) {
  84                      $t1 = explode( ' ', microtime() );
  85                      # Do the query
  86                      $num = $queryPage->recache( $limit === null ? $wgQueryCacheLimit : $limit );
  87                      $t2 = explode( ' ', microtime() );
  88                      if ( $num === false ) {
  89                          $this->output( "FAILED: database error\n" );
  90                      } else {
  91                          $this->output( "got $num rows in " );
  92  
  93                          $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
  94                          $hours = intval( $elapsed / 3600 );
  95                          $minutes = intval( $elapsed % 3600 / 60 );
  96                          $seconds = $elapsed - $hours * 3600 - $minutes * 60;
  97                          if ( $hours ) {
  98                              $this->output( $hours . 'h ' );
  99                          }
 100                          if ( $minutes ) {
 101                              $this->output( $minutes . 'm ' );
 102                          }
 103                          $this->output( sprintf( "%.2fs\n", $seconds ) );
 104                      }
 105                      # Reopen any connections that have closed
 106                      if ( !wfGetLB()->pingAll() ) {
 107                          $this->output( "\n" );
 108                          do {
 109                              $this->error( "Connection failed, reconnecting in 10 seconds..." );
 110                              sleep( 10 );
 111                          } while ( !wfGetLB()->pingAll() );
 112                          $this->output( "Reconnected\n\n" );
 113                      }
 114                      # Wait for the slave to catch up
 115                      wfWaitForSlaves();
 116                  } else {
 117                      $this->output( "cheap, skipped\n" );
 118                  }
 119                  if ( $this->hasOption( 'only' ) ) {
 120                      break;
 121                  }
 122              }
 123          }
 124      }
 125  
 126  	public function doSpecialPageCacheUpdates( $dbw ) {
 127          global $wgSpecialPageCacheUpdates;
 128  
 129          foreach ( $wgSpecialPageCacheUpdates as $special => $call ) {
 130              # --list : just show the name of pages
 131              if ( $this->hasOption( 'list' ) ) {
 132                  $this->output( "$special [callback]\n" );
 133                  continue;
 134              }
 135  
 136              if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $special ) {
 137                  if ( !is_callable( $call ) ) {
 138                      $this->error( "Uncallable function $call!" );
 139                      continue;
 140                  }
 141                  $this->output( sprintf( '%-30s [callback] ', $special ) );
 142                  $t1 = explode( ' ', microtime() );
 143                  call_user_func( $call, $dbw );
 144                  $t2 = explode( ' ', microtime() );
 145  
 146                  $this->output( "completed in " );
 147                  $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
 148                  $hours = intval( $elapsed / 3600 );
 149                  $minutes = intval( $elapsed % 3600 / 60 );
 150                  $seconds = $elapsed - $hours * 3600 - $minutes * 60;
 151                  if ( $hours ) {
 152                      $this->output( $hours . 'h ' );
 153                  }
 154                  if ( $minutes ) {
 155                      $this->output( $minutes . 'm ' );
 156                  }
 157                  $this->output( sprintf( "%.2fs\n", $seconds ) );
 158                  # Wait for the slave to catch up
 159                  wfWaitForSlaves();
 160              }
 161          }
 162      }
 163  }
 164  
 165  $maintClass = "UpdateSpecialPages";
 166  require_once RUN_MAINTENANCE_IF_MAIN;


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1