[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Remove old or broken uploads from temporary uploaded file storage, 4 * clean up associated database records 5 * 6 * Copyright © 2011, Wikimedia Foundation 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License along 19 * with this program; if not, write to the Free Software Foundation, Inc., 20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 21 * http://www.gnu.org/copyleft/gpl.html 22 * 23 * @file 24 * @author Ian Baker <[email protected]> 25 * @ingroup Maintenance 26 */ 27 28 require_once __DIR__ . '/Maintenance.php'; 29 30 /** 31 * Maintenance script to remove old or broken uploads from temporary uploaded 32 * file storage and clean up associated database records. 33 * 34 * @ingroup Maintenance 35 */ 36 class UploadStashCleanup extends Maintenance { 37 38 public function __construct() { 39 parent::__construct(); 40 $this->mDescription = "Clean up abandoned files in temporary uploaded file stash"; 41 $this->setBatchSize( 50 ); 42 } 43 44 public function execute() { 45 global $wgUploadStashMaxAge; 46 47 $repo = RepoGroup::singleton()->getLocalRepo(); 48 $tempRepo = $repo->getTempRepo(); 49 50 $dbr = $repo->getSlaveDb(); 51 52 // how far back should this look for files to delete? 53 $cutoff = time() - $wgUploadStashMaxAge; 54 55 $this->output( "Getting list of files to clean up...\n" ); 56 $res = $dbr->select( 57 'uploadstash', 58 'us_key', 59 'us_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( $cutoff ) ), 60 __METHOD__ 61 ); 62 63 // Delete all registered stash files... 64 if ( $res->numRows() == 0 ) { 65 $this->output( "No stashed files to cleanup according to the DB.\n" ); 66 } else { 67 // finish the read before starting writes. 68 $keys = array(); 69 foreach ( $res as $row ) { 70 array_push( $keys, $row->us_key ); 71 } 72 73 $this->output( 'Removing ' . count( $keys ) . " file(s)...\n" ); 74 // this could be done some other, more direct/efficient way, but using 75 // UploadStash's own methods means it's less likely to fall accidentally 76 // out-of-date someday 77 $stash = new UploadStash( $repo ); 78 79 $i = 0; 80 foreach ( $keys as $key ) { 81 $i++; 82 try { 83 $stash->getFile( $key, true ); 84 $stash->removeFileNoAuth( $key ); 85 } catch ( UploadStashException $ex ) { 86 $type = get_class( $ex ); 87 $this->output( "Failed removing stashed upload with key: $key ($type)\n" ); 88 } 89 if ( $i % 100 == 0 ) { 90 $this->output( "$i\n" ); 91 } 92 } 93 $this->output( "$i done\n" ); 94 } 95 96 // Delete all the corresponding thumbnails... 97 $dir = $tempRepo->getZonePath( 'thumb' ); 98 $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir, 'adviseStat' => 1 ) ); 99 $this->output( "Deleting old thumbnails...\n" ); 100 $i = 0; 101 $batch = array(); // operation batch 102 foreach ( $iterator as $file ) { 103 if ( wfTimestamp( TS_UNIX, $tempRepo->getFileTimestamp( "$dir/$file" ) ) < $cutoff ) { 104 $batch[] = array( 'op' => 'delete', 'src' => "$dir/$file" ); 105 if ( count( $batch ) >= $this->mBatchSize ) { 106 $this->doOperations( $tempRepo, $batch ); 107 $i += count( $batch ); 108 $batch = array(); 109 $this->output( "$i\n" ); 110 } 111 } 112 } 113 if ( count( $batch ) ) { 114 $this->doOperations( $tempRepo, $batch ); 115 $i += count( $batch ); 116 } 117 $this->output( "$i done\n" ); 118 119 // Apparently lots of stash files are not registered in the DB... 120 $dir = $tempRepo->getZonePath( 'public' ); 121 $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir, 'adviseStat' => 1 ) ); 122 $this->output( "Deleting orphaned temp files...\n" ); 123 if ( strpos( $dir, '/local-temp' ) === false ) { // sanity check 124 $this->error( "Temp repo is not using the temp container.", 1 ); // die 125 } 126 $i = 0; 127 $batch = array(); // operation batch 128 foreach ( $iterator as $file ) { 129 if ( wfTimestamp( TS_UNIX, $tempRepo->getFileTimestamp( "$dir/$file" ) ) < $cutoff ) { 130 $batch[] = array( 'op' => 'delete', 'src' => "$dir/$file" ); 131 if ( count( $batch ) >= $this->mBatchSize ) { 132 $this->doOperations( $tempRepo, $batch ); 133 $i += count( $batch ); 134 $batch = array(); 135 $this->output( "$i\n" ); 136 } 137 } 138 } 139 if ( count( $batch ) ) { 140 $this->doOperations( $tempRepo, $batch ); 141 $i += count( $batch ); 142 } 143 $this->output( "$i done\n" ); 144 } 145 146 protected function doOperations( FileRepo $tempRepo, array $ops ) { 147 $status = $tempRepo->getBackend()->doQuickOperations( $ops ); 148 if ( !$status->isOK() ) { 149 $this->error( print_r( $status->getErrorsArray(), true ) ); 150 } 151 } 152 } 153 154 $maintClass = "UploadStashCleanup"; 155 require_once RUN_MAINTENANCE_IF_MAIN;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |