Request for Comments: Modify tempnam() to handle directories and auto-cleanup
This RFC recommends a set of changes to the tempnam() standard function.
- Extend the signature to include an “options” parameter (default keeping current behavior).
- Define TEMPNAM_DIR constant which, when passed to options, creates a directory instead of a file.
- Define TEMPNAM_REQUEST constant which, when passed to options, automatically removes the file/directory at the end of the request.
It's a common bug to forget to remove temporary files and after a period of time these may overpopulate the filesystem. TEMPNAM_REQUEST seeks to avoid this by building a mechanism to automatically clean up after scripts.
$fn = tempnam("/tmp/", "test-", TEMPNAM_REQUEST); file_put_contents($fn, "This is some data"); echo shell_exec("/usr/bin/someprog " . escapeshellarg($fn)); // No need to explicitly unlink($fn), since it will be cleaned up at request end
TEMPNAM_DIR expands the scope and usability of this function to whole directories of files while keeping the number of entities which need to be tracked low.
$file = tempnam("/tmp/", "", TEMPNAM_REQUEST); copy('http://www.php.net/get/php-5.4.9.tar.gz/from/us3.php.net/mirror', $file); $dir = tempnam("/tmp/", "", TEMPNAM_DIR | TEMPNAM_REQUEST); $dir = escapeshellarg($dir); $file = escapeshellarg($file); shell_exec("cd $dir && tar -zxf $file"); // tarball expanded into dir, both will be removed at request end
Although the existing function tmpfile() provides for the TEMPNAM_REQUEST cleanup functionality, it does not provide an actual filename which can be passed to external programs.
- Add a HashTable to FG() locals for tracking request-temporary files/directories.
- Expand tempnam() to call existing system functions when options == 0
- For cases when options != 0, generate a filename using dir/prefix and uniqid() (or other mechanism) and attempt to create manually.
- For the TEMPNAM_REQUEST case specifically, add the generated filename to FG(request_tempnam) HashTable.
- At end of request, iterate through FG(request_tempnam) removing all temporary files/dirs.
- Leave tempnam() as it is, but add request_cleanup() function(s) to manage list of files to delete at request end. e.g. request_cleanup($fn = tempnam(“/tmp”,“”));
- Add tempdir() function to separate that out from the request auto-cleanup subject
Proposal and Patch
Coming soon, giving a chance to start discussion early.