MediaWiki  master
cleanupRemovedModules.php
Go to the documentation of this file.
1 <?php
27 
28 require_once __DIR__ . '/Maintenance.php';
29 
37 
38  public function __construct() {
39  parent::__construct();
40  $this->addDescription(
41  'Remove cache entries for removed ResourceLoader modules from the database' );
42  $this->setBatchSize( 500 );
43  }
44 
45  public function execute() {
46  $this->output( "Cleaning up module_deps table...\n" );
47 
48  $dbw = $this->getDB( DB_MASTER );
49  $rl = MediaWikiServices::getInstance()->getResourceLoader();
50  $moduleNames = $rl->getModuleNames();
51  $res = $dbw->select( 'module_deps',
52  [ 'md_module', 'md_skin' ],
53  $moduleNames ? 'md_module NOT IN (' . $dbw->makeList( $moduleNames ) . ')' : '1=1',
54  __METHOD__
55  );
56  $rows = iterator_to_array( $res, false );
57 
58  $modDeps = $dbw->tableName( 'module_deps' );
59  $i = 1;
60  foreach ( array_chunk( $rows, $this->getBatchSize() ) as $chunk ) {
61  // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) ..
62  $conds = array_map( function ( stdClass $row ) use ( $dbw ) {
63  return $dbw->makeList( (array)$row, IDatabase::LIST_AND );
64  }, $chunk );
65  $conds = $dbw->makeList( $conds, IDatabase::LIST_OR );
66 
67  $this->beginTransaction( $dbw, __METHOD__ );
68  $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ );
69  $numRows = $dbw->affectedRows();
70  $this->output( "Batch $i: $numRows rows\n" );
71  $this->commitTransaction( $dbw, __METHOD__ );
72 
73  $i++;
74  }
75 
76  $this->output( "Done\n" );
77  }
78 }
79 
80 $maintClass = CleanupRemovedModules::class;
81 require_once RUN_MAINTENANCE_IF_MAIN;
commitTransaction(IDatabase $dbw, $fname)
Commit the transcation on a DB handle and wait for replica DBs to catch up.
const RUN_MAINTENANCE_IF_MAIN
Definition: Maintenance.php:39
Abstract maintenance class for quickly writing and churning out maintenance scripts with minimal effo...
Definition: Maintenance.php:86
setBatchSize( $s=0)
Set the batch size.
Maintenance script to remove cache entries for removed ResourceLoader modules from the database...
const DB_MASTER
Definition: defines.php:26
const LIST_AND
Definition: Defines.php:39
addDescription( $text)
Set the description text.
output( $out, $channel=null)
Throw some output to the user.
const LIST_OR
Definition: Defines.php:42
getBatchSize()
Returns batch size.
getDB( $db, $groups=[], $dbDomain=false)
Returns a database to be used by current maintenance script.
beginTransaction(IDatabase $dbw, $fname)
Begin a transcation on a DB.