W3docs

tempnam()

En PHP, la función tempnam() crea un archivo temporal con un nombre único. Es muy útil para trabajar con archivos en tus scripts PHP.

Introducción

tempnam() crea un archivo temporal con un nombre único y devuelve la ruta completa hacia él. Lo importante es que no solo genera un nombre: crea el archivo en disco (vacío, con modo 0600), por lo que no existe condición de carrera en la que dos procesos puedan elegir el mismo nombre. Úsala cuando tu script necesite espacio temporal en disco: almacenar en búfer una carga, generar un informe antes de transmitirlo, o pasar una ruta a un comando externo.

Este capítulo cubre la sintaxis, el valor de retorno, dónde se crea el archivo, los errores más comunes en producción y cómo limpiar después.

Sintaxis

tempnam(string $directory, string $prefix): string|false
ParámetroDescripción
$directoryEl directorio donde se debe crear el archivo. Si no existe o no tiene permisos de escritura, PHP recurre al directorio temporal del sistema (sys_get_temp_dir()).
$prefixUn prefijo para el nombre de archivo generado. En la mayoría de los sistemas solo se usan los primeros 63 caracteres; en Windows solo los primeros 3.

Valor de retorno: la ruta completa al archivo recién creado (p. ej. /tmp/example_aB3xYz), o false en caso de error.

Crear un archivo temporal

<?php

$tempFile = tempnam(sys_get_temp_dir(), 'example_');
echo $tempFile;
// e.g. /tmp/example_8gKq2P

sys_get_temp_dir() devuelve el directorio temporal del sistema operativo (/tmp en Linux/macOS, la ruta TEMP en Windows), lo cual es más portable que escribir /tmp directamente.

Escribir y leer el archivo

tempnam() solo te proporciona la ruta a un archivo vacío; aún debes abrirlo para introducir datos:

<?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() no elimina el archivo por ti, siempre bórralo con unlink() cuando hayas terminado; de lo contrario, los archivos temporales se acumulan.

El comportamiento de respaldo

Si $directory no existe o no tiene permisos de escritura, tempnam() no falla directamente: crea el archivo en silencio en el directorio temporal del sistema. Esto significa que la ruta devuelta puede no estar dentro del directorio solicitado, así que nunca asumas la ubicación:

<?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 back

Usa siempre la ruta devuelta para las operaciones posteriores, en lugar de reconstruirla a partir de $directory y $prefix.

tempnam() vs tmpfile()

Ambas crean un archivo temporal único, pero sirven para distintos propósitos:

  • tempnam() devuelve una ruta (string). El archivo persiste hasta que lo elimines con unlink(), y puedes pasar la ruta a otras funciones o programas externos.
  • tmpfile() devuelve un manejador de archivo abierto, y el archivo se elimina automáticamente cuando se cierra el manejador o termina el script. Úsala cuando solo necesites el manejador y quieras limpieza automática.

Elige tempnam() cuando algo más necesite el nombre del archivo; elige tmpfile() cuando solo necesites un manejador temporal que se limpie solo.

Errores comunes

  • Crea el archivo. El archivo ya existe (vacío) tras la llamada, por lo que comprobar file_exists() sobre el resultado siempre es verdadero. Para detectar fallos, compara con false.
  • Siempre usa unlink. Los archivos temporales no se eliminan automáticamente. Acompaña cada tempnam() con un unlink(), preferiblemente en un bloque finally.
  • No confíes en el directorio. Por el comportamiento de respaldo, el archivo puede no estar donde lo pediste. Usa la ruta devuelta.
  • El prefijo se trunca. Los prefijos largos se recortan (3 caracteres en Windows), así que no dependas de que el prefijo completo esté presente en el nombre.

Conclusión

tempnam() crea de forma segura un archivo temporal con nombre único, vacío, y devuelve su ruta. Recuerda que crea el archivo (no solo el nombre), puede recurrir al directorio temporal del sistema, y nunca limpia por sí sola; así que trabaja siempre con la ruta devuelta y llama a unlink() cuando termines. Si solo necesitas un manejador que se elimine solo, prefiere tmpfile().

Práctica

Práctica
¿Qué hace la función tempnam() en PHP?
¿Qué hace la función tempnam() en PHP?
Was this page helpful?