[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/maintenance/ -> purgeList.php (source)

   1  <?php
   2  /**
   3   * Send purge requests for listed pages to squid
   4   *
   5   * This program is free software; you can redistribute it and/or modify
   6   * it under the terms of the GNU General Public License as published by
   7   * the Free Software Foundation; either version 2 of the License, or
   8   * (at your option) any later version.
   9   *
  10   * This program is distributed in the hope that it will be useful,
  11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13   * GNU General Public License for more details.
  14   *
  15   * You should have received a copy of the GNU General Public License along
  16   * with this program; if not, write to the Free Software Foundation, Inc.,
  17   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18   * http://www.gnu.org/copyleft/gpl.html
  19   *
  20   * @file
  21   * @ingroup Maintenance
  22   */
  23  
  24  require_once  __DIR__ . '/Maintenance.php';
  25  
  26  /**
  27   * Maintenance script that sends purge requests for listed pages to squid.
  28   *
  29   * @ingroup Maintenance
  30   */
  31  class PurgeList extends Maintenance {
  32  	public function __construct() {
  33          parent::__construct();
  34          $this->mDescription = "Send purge requests for listed pages to squid";
  35          $this->addOption( 'purge', 'Whether to update page_touched.', false, false );
  36          $this->addOption( 'namespace', 'Namespace number', false, true );
  37          $this->addOption( 'all', 'Purge all pages', false, false );
  38          $this->addOption( 'delay', 'Number of seconds to delay between each purge', false, true );
  39          $this->addOption( 'verbose', 'Show more output', false, false, 'v' );
  40          $this->setBatchSize( 100 );
  41      }
  42  
  43  	public function execute() {
  44          if ( $this->hasOption( 'all' ) ) {
  45              $this->purgeNamespace( false );
  46          } elseif ( $this->hasOption( 'namespace' ) ) {
  47              $this->purgeNamespace( intval( $this->getOption( 'namespace' ) ) );
  48          } else {
  49              $this->doPurge();
  50          }
  51          $this->output( "Done!\n" );
  52      }
  53  
  54      /**
  55       * Purge URL coming from stdin
  56       */
  57  	private function doPurge() {
  58          $stdin = $this->getStdin();
  59          $urls = array();
  60  
  61          while ( !feof( $stdin ) ) {
  62              $page = trim( fgets( $stdin ) );
  63              if ( preg_match( '%^https?://%', $page ) ) {
  64                  $urls[] = $page;
  65              } elseif ( $page !== '' ) {
  66                  $title = Title::newFromText( $page );
  67                  if ( $title ) {
  68                      $url = $title->getInternalURL();
  69                      $this->output( "$url\n" );
  70                      $urls[] = $url;
  71                      if ( $this->getOption( 'purge' ) ) {
  72                          $title->invalidateCache();
  73                      }
  74                  } else {
  75                      $this->output( "(Invalid title '$page')\n" );
  76                  }
  77              }
  78          }
  79          $this->output( "Purging " . count( $urls ) . " urls\n" );
  80          $this->sendPurgeRequest( $urls );
  81      }
  82  
  83      /**
  84       * Purge a namespace or all pages
  85       *
  86       * @param int|bool $namespace
  87       */
  88  	private function purgeNamespace( $namespace = false ) {
  89          $dbr = wfGetDB( DB_SLAVE );
  90          $startId = 0;
  91          if ( $namespace === false ) {
  92              $conds = array();
  93          } else {
  94              $conds = array( 'page_namespace' => $namespace );
  95          }
  96          while ( true ) {
  97              $res = $dbr->select( 'page',
  98                  array( 'page_id', 'page_namespace', 'page_title' ),
  99                  $conds + array( 'page_id > ' . $dbr->addQuotes( $startId ) ),
 100                  __METHOD__,
 101                  array(
 102                      'LIMIT' => $this->mBatchSize,
 103                      'ORDER BY' => 'page_id'
 104  
 105                  )
 106              );
 107              if ( !$res->numRows() ) {
 108                  break;
 109              }
 110              $urls = array();
 111              foreach ( $res as $row ) {
 112                  $title = Title::makeTitle( $row->page_namespace, $row->page_title );
 113                  $url = $title->getInternalURL();
 114                  $urls[] = $url;
 115                  $startId = $row->page_id;
 116              }
 117              $this->sendPurgeRequest( $urls );
 118          }
 119      }
 120  
 121      /**
 122       * Helper to purge an array of $urls
 123       * @param array $urls List of URLS to purge from squids
 124       */
 125  	private function sendPurgeRequest( $urls ) {
 126          if ( $this->hasOption( 'delay' ) ) {
 127              $delay = floatval( $this->getOption( 'delay' ) );
 128              foreach ( $urls as $url ) {
 129                  if ( $this->hasOption( 'verbose' ) ) {
 130                      $this->output( $url . "\n" );
 131                  }
 132                  $u = new SquidUpdate( array( $url ) );
 133                  $u->doUpdate();
 134                  usleep( $delay * 1e6 );
 135              }
 136          } else {
 137              if ( $this->hasOption( 'verbose' ) ) {
 138                  $this->output( implode( "\n", $urls ) . "\n" );
 139              }
 140              $u = new SquidUpdate( $urls );
 141              $u->doUpdate();
 142          }
 143      }
 144  }
 145  
 146  $maintClass = "PurgeList";
 147  require_once RUN_MAINTENANCE_IF_MAIN;


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