Temporary file wrapper. Created files are deleted at the end of the script.
composer require zenstruck/stream
use Zenstruck\TempFile;
// create empty file with random name (in /tmp)
$file = TempFile::new();
// create empty file with random filename, with extension (in /tmp)
$file = TempFile::withExtension('txt');
// create for existing file
$file = TempFile::new('some/file.txt'); // note: will be deleted at the end of the script
// create with string content
$file = TempFile::for('some contents');
// create with resource
$file = TempFile::for(\fopen('some/file.txt', 'r'));
// create from another file (existing file is copied)
$file = TempFile::for(new \SplFileInfo('some/file.txt'));
// create image
$image = TempFile::image(); // temporary 10x10 image with 'jpg' as the extension
$image = TempFile::image(100, 50); // customize the dimensions
$image = TempFile::image(type: 'gif'); // customize the image type
/** @var \Zenstruck\TempFile $file */
$file->contents(); // string - the file's contents
$file->refresh(); // self - clearstatcache() on the file (refreshes metadata)
$file->delete(); // self - delete the file
// is instance of \SplFileInfo
$file->getMTime(); // int - last modified timestamp
$file->getExtension(); // string - file extension
Created TempFile
's are automatically deleted at the end of the script by keeping
track of created files and purging with register_shutdown_function
. If using a
long-running PHP process (like a worker or Swoole/RoadRunner runtime) the files
will not be purged until the process is stopped. This creates a memory leak as the
tracked created files grows in memory. To combat this, you'll need to hook into
some kind of event in your process that enables you to clear these type of leaks
and call TempFile::purge()
manually.
A simple service is provided to purge TempFile
's at the end of each request
and, if using symfony/messenger, after a job is processed.
To use, register the service:
# config/packages/zenstruck_temp_file.yaml
Zenstruck\TempFile\Bridge\Symfony\PurgeTempFiles:
tags: [kernel.reset]