1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
<?php
namespace MediaWiki\FileBackend\FSFile;
use Wikimedia\AtEase\AtEase;
use Wikimedia\FileBackend\FSFile\TempFSFile;
/**
* @ingroup FileBackend
*/
class TempFSFileFactory {
/** @var string|null */
private $tmpDirectory;
/**
* @param string|null $tmpDirectory A directory to put the temporary files in, e.g.,
* $wgTmpDirectory. If null, we'll try to find one ourselves.
*/
public function __construct( $tmpDirectory = null ) {
$this->tmpDirectory = $tmpDirectory;
}
/**
* Make a new temporary file on the file system.
* Temporary files may be purged when the file object falls out of scope.
*
* @param string $prefix
* @param string $extension Optional file extension
* @return TempFSFile|null
*/
public function newTempFSFile( $prefix, $extension = '' ) {
$ext = ( $extension != '' ) ? ".{$extension}" : '';
$tmpDirectory = $this->tmpDirectory;
if ( !is_string( $tmpDirectory ) ) {
$tmpDirectory = TempFSFile::getUsableTempDirectory();
}
$attempts = 5;
while ( $attempts-- ) {
$hex = sprintf( '%06x%06x', mt_rand( 0, 0xffffff ), mt_rand( 0, 0xffffff ) );
$path = "$tmpDirectory/$prefix$hex$ext";
AtEase::suppressWarnings();
$newFileHandle = fopen( $path, 'x' );
AtEase::restoreWarnings();
if ( $newFileHandle ) {
fclose( $newFileHandle );
$tmpFile = new TempFSFile( $path );
$tmpFile->autocollect();
// Safely instantiated, end loop.
return $tmpFile;
}
}
// Give up
return null; // @codeCoverageIgnore
}
}
|