PHP RFC: Support optional suffix parameter in tempnam


The tempnam function allows users to optionally specify a prefix to be prepended to the generated filenames.

It would be useful to allow users to also specify a suffix when generating temporary files. For instance, a suffix could provide even more semantic value or context for a user inspecting the generated files, and, in specific situations, could even provide more context for software processing such files.


Add a new optional suffix parameter to the tempnam function, changing its signature from

tempnam(string $directory, string $prefix): string|false


tempnam(string $directory, string $prefix, string $suffix = ""): string|false


tempnam("/tmp", "application-");
/* /tmp/application-xxxxxx */
tempnam("/tmp", "", ".pdf");
/* /tmp/xxxxxx.pdf */
tempnam("/tmp", "application-", ".pdf");
/* /tmp/application-xxxxxx.pdf */

Backward Incompatible Changes

None with exception of changing the signature of the internal php_do_open_temporary_file function, which is not exported.

Proposed PHP Version(s)

next PHP 8.x.

RFC Impact

The suffix-parameter is optional. Thus it is transparent to any existing PHP-code in use.

Only the internal API is affected because of the additional parameter which is added. Still, this only includes the addition of a new function (php_open_temporary_fd_ex2) and changing the signature of the php_do_open_temporary_file function, which is not exported.

Open Issues

Unaffected PHP Functionality

All but tempnam and the internal php_do_open_temporary_file function.

Future Scope

The tempnam prefix paramter is sanitized through the basename function when path separators are present in the provided string, using only the last part of the provided path. For instance, foo/bar would become bar. We could not find the historical reasons for the prefix parameter to behave as described, but for consistency, we are currently using the same approach for the new suffix parameter.

Moreover,o nly the 63 first characters passed to the prefix paramter are used. Although we could not find the historical reasons behind this decision, we are currently replicating the behavior for the new suffix parameter.

Finally, In windows systems, none of the characters passed as a suffix will be appended to the file name (i.e., the suffix parameter will be ignored). This is due to the underlying function (and API) used to generate temporary files, which do not provide means to set a suffix. While we could provide a custom implementation, the current windows API being used includes a .TMP extension to the generated files, which AFAICT, does matter in windows systems. I also found a related discussion in an old bug at https://bugs.php.net/bug.php?id=44222. Changing such behaviors would require a different RFC.

Therefore, the following changes are left for future work:

* Re-visit tempnam's implementation to verify the need to truncate the prefix/suffix params at 64 characters. * Re-visit tempnam's implementation to verify the need to modify the prefix/suffix params thorugh the basename function. * Re-work tempnam's windows implementation to match the default non-windows behaviors.

The first two could be part of a minor refactoring effort for tempnam. The last one, however, should be part of a major refactoring effort for tempnam.

Proposed Voting Choices

Accept this RFC and accept an optional suffix parameter in the tempnam function? Yes / No

Patches and Tests

The following is a candidate for this proposal, which includes the assumptions presented in the Open Issues section above.



As linked above


Support optional suffix parameter in tempnam
Real name Yes No
alcaeus (alcaeus)  
crell (crell)  
galvao (galvao)  
jhdxr (jhdxr)  
kalle (kalle)  
levim (levim)  
mbeccati (mbeccati)  
ocramius (ocramius)  
pierrick (pierrick)  
svpernova09 (svpernova09)  
timwolla (timwolla)  
Final result: 0 11
This poll has been closed.


rfc/tempnam-suffix-v2.txt · Last modified: 2023/08/27 01:45 by athos