tempnam()
A função tempnam() do PHP cria um arquivo temporário com nome único e retorna o caminho completo. Saiba como usá-la com segurança nos scripts.
Introdução
tempnam() cria um arquivo temporário com um nome único e retorna o caminho completo para ele. De forma importante, ela não apenas gera um nome — ela cria o arquivo no disco (vazio, com permissão 0600), eliminando a condição de corrida em que dois processos poderiam escolher o mesmo nome. Use-a sempre que seu script precisar de espaço temporário em disco: armazenar em buffer um upload, gerar um relatório antes de transmiti-lo ou passar um caminho para um comando externo.
Este capítulo aborda a sintaxe, o valor de retorno, onde o arquivo é criado de fato, os problemas que surgem em produção e como fazer a limpeza depois.
Sintaxe
tempnam(string $directory, string $prefix): string|false| Parâmetro | Descrição |
|---|---|
$directory | O diretório em que o arquivo deve ser criado. Se ele não existir ou não for gravável, o PHP usa como alternativa o diretório temporário do sistema (sys_get_temp_dir()). |
$prefix | Um prefixo para o nome de arquivo gerado. Na maioria dos sistemas, apenas os primeiros 63 caracteres são utilizados; no Windows, apenas os primeiros 3. |
Valor de retorno: o caminho completo para o arquivo recém-criado (por exemplo, /tmp/example_aB3xYz), ou false em caso de falha.
Criando um arquivo temporário
<?php
$tempFile = tempnam(sys_get_temp_dir(), 'example_');
echo $tempFile;
// e.g. /tmp/example_8gKq2Psys_get_temp_dir() retorna o diretório temporário do sistema operacional (/tmp no Linux/macOS, o caminho TEMP no Windows), o que é mais portável do que usar /tmp diretamente no código.
Escrevendo e lendo o arquivo
tempnam() apenas fornece um caminho para um arquivo vazio — você ainda precisa abri-lo para inserir dados:
<?php
$tempFile = tempnam(sys_get_temp_dir(), 'report_');
// Write some data
file_put_contents($tempFile, "Line 1\nLine 2\n");
// Read it back
echo file_get_contents($tempFile);
// Line 1
// Line 2
// Clean up when you're done
unlink($tempFile);Como tempnam() não exclui o arquivo por conta própria, sempre o remova com unlink() quando terminar — caso contrário, os arquivos temporários se acumulam.
O comportamento de fallback
Se $directory não existir ou não for gravável, tempnam() não falha diretamente — ela cria silenciosamente o arquivo no diretório temporário do sistema. Isso significa que o caminho retornado pode não estar dentro do diretório solicitado, portanto nunca assuma a localização:
<?php
// /no/such/dir doesn't exist
$tempFile = tempnam('/no/such/dir', 'data_');
// File is created in sys_get_temp_dir(), not /no/such/dir
echo dirname($tempFile) === sys_get_temp_dir() ? 'fell back' : $tempFile;
// fell backSempre use o caminho retornado para operações subsequentes, em vez de reconstruí-lo a partir de $directory e $prefix.
tempnam() vs tmpfile()
Ambas criam um arquivo temporário único, mas servem a necessidades diferentes:
tempnam()retorna um caminho (string). O arquivo persiste até que você o remova comunlink(), e você pode passar o caminho para outras funções ou programas externos.tmpfile()retorna um identificador de arquivo aberto, e o arquivo é excluído automaticamente quando o identificador é fechado ou o script termina. Use-a quando precisar apenas do identificador e quiser limpeza automática.
Opte por tempnam() quando algo mais precisar do nome do arquivo; opte por tmpfile() quando precisar apenas de um identificador temporário com autolimpeza.
Problemas comuns
- Ela cria o arquivo. O arquivo já existe (vazio) após a chamada, portanto verificar
file_exists()no resultado sempre retornará verdadeiro. Para detectar falhas, compare comfalse. - Sempre use unlink. Arquivos temporários não são removidos automaticamente. Combine cada
tempnam()com umunlink(), idealmente em um blocofinally. - Não confie no diretório. Por causa do fallback, o arquivo pode não estar onde você pediu. Use o caminho retornado.
- O prefixo é truncado. Prefixos longos são cortados (3 caracteres no Windows), portanto não conte com o prefixo completo presente no nome.
Conclusão
tempnam() cria com segurança um arquivo temporário vazio com nome único e retorna seu caminho. Lembre-se de que ela cria o arquivo (não apenas um nome), pode usar o diretório temporário do sistema como alternativa e nunca faz a limpeza sozinha — portanto sempre trabalhe com o caminho retornado e chame unlink() quando terminar. Quando precisar apenas de um identificador com autodeleção, prefira tmpfile().