]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - maintenance/purgeParserCache.php
MediaWiki 1.30.2-scripts2
[autoinstalls/mediawiki.git] / maintenance / purgeParserCache.php
1 <?php
2 /**
3  * Remove old objects from the parser cache.
4  * This only works when the parser cache is in an SQL database.
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 __DIR__ . '/Maintenance.php';
26
27 use MediaWiki\MediaWikiServices;
28
29 /**
30  * Maintenance script to remove old objects from the parser cache.
31  *
32  * @ingroup Maintenance
33  */
34 class PurgeParserCache extends Maintenance {
35         public $lastProgress;
36
37         private $usleep = 0;
38
39         function __construct() {
40                 parent::__construct();
41                 $this->addDescription( "Remove old objects from the parser cache. " .
42                         "This only works when the parser cache is in an SQL database." );
43                 $this->addOption( 'expiredate', 'Delete objects expiring before this date.', false, true );
44                 $this->addOption(
45                         'age',
46                         'Delete objects created more than this many seconds ago, assuming ' .
47                                 '$wgParserCacheExpireTime has remained consistent.',
48                         false,
49                         true );
50                 $this->addOption( 'msleep', 'Milliseconds to sleep between purge chunks', false, true );
51         }
52
53         function execute() {
54                 global $wgParserCacheExpireTime;
55
56                 $inputDate = $this->getOption( 'expiredate' );
57                 $inputAge = $this->getOption( 'age' );
58                 if ( $inputDate !== null ) {
59                         $date = wfTimestamp( TS_MW, strtotime( $inputDate ) );
60                 } elseif ( $inputAge !== null ) {
61                         $date = wfTimestamp( TS_MW, time() + $wgParserCacheExpireTime - intval( $inputAge ) );
62                 } else {
63                         $this->error( "Must specify either --expiredate or --age", 1 );
64                         return;
65                 }
66                 $this->usleep = 1e3 * $this->getOption( 'msleep', 0 );
67
68                 $english = Language::factory( 'en' );
69                 $this->output( "Deleting objects expiring before " .
70                         $english->timeanddate( $date ) . "\n" );
71
72                 $pc = MediaWikiServices::getInstance()->getParserCache()->getCacheStorage();
73                 $success = $pc->deleteObjectsExpiringBefore( $date, [ $this, 'showProgressAndWait' ] );
74                 if ( !$success ) {
75                         $this->error( "\nCannot purge this kind of parser cache.", 1 );
76                 }
77                 $this->showProgressAndWait( 100 );
78                 $this->output( "\nDone\n" );
79         }
80
81         public function showProgressAndWait( $percent ) {
82                 usleep( $this->usleep ); // avoid lag; T150124
83
84                 $percentString = sprintf( "%.2f", $percent );
85                 if ( $percentString === $this->lastProgress ) {
86                         return;
87                 }
88                 $this->lastProgress = $percentString;
89
90                 $stars = floor( $percent / 2 );
91                 $this->output( '[' . str_repeat( '*', $stars ) . str_repeat( '.', 50 - $stars ) . '] ' .
92                         "$percentString%\r" );
93         }
94 }
95
96 $maintClass = 'PurgeParserCache';
97 require_once RUN_MAINTENANCE_IF_MAIN;