tmpfile()
En PHP, la función tmpfile() crea un archivo temporal. Aprende su sintaxis, comportamiento de limpieza automática y ejemplos prácticos.
Introducción
Cuando un script PHP necesita un lugar donde almacenar datos que solo importan durante esa solicitud — un búfer demasiado grande para mantener en memoria, un CSV que estás a punto de enviar al navegador, la salida capturada de un comando externo — recurres a un archivo temporal. La función tmpfile() te proporciona uno con una sola llamada: crea un archivo único en el directorio temporal del sistema, lo abre para lectura y escritura, y devuelve un manejador de archivo. Y lo mejor de todo, limpia después de sí misma.
Este capítulo cubre la sintaxis, el comportamiento de limpieza automática que hace especial a tmpfile(), cuándo usarla frente a tempnam(), y varios ejemplos ejecutables incluyendo algunos errores comunes.
¿Qué es un Archivo Temporal?
Un archivo temporal es un archivo que tu programa utiliza como espacio de trabajo y no tiene intención de conservar. Reside en el directorio temporal del sistema operativo (/tmp en Linux/macOS, C:\Windows\Temp o la ruta en la variable de entorno TEMP en Windows). Debido a que muchos procesos comparten ese directorio, los archivos temporales necesitan nombres únicos para que dos scripts no se interfieran entre sí — tmpfile() gestiona esa unicidad por ti.
Entendiendo la Función tmpfile()
La función tmpfile() crea un archivo temporal con un nombre único en el directorio temporal del sistema y lo abre para lectura y escritura en modo w+ (el archivo comienza vacío y puedes tanto escribir en él como leerlo de vuelta). No toma parámetros.
La característica clave es la limpieza automática. El archivo temporal se elimina cuando:
- cierras el manejador con
fclose(), o - el script finaliza y el manejador queda fuera del alcance.
Debido a esto, casi nunca necesitas eliminar el archivo tú mismo. La contrapartida es que tmpfile() no te indica la ruta del archivo — el manejador es la única referencia que obtienes. Si necesitas un nombre de archivo conocido que puedas pasar a otro programa, usa tempnam() en su lugar.
Sintaxis de la Función tmpfile()
La sintaxis de la función tmpfile() es la siguiente:
tmpfile(): resource|falseLa función no toma argumentos y devuelve:
- un manejador de archivo (resource) posicionado al inicio del archivo vacío en caso de éxito, o
falseen caso de fallo — por ejemplo, cuando el directorio temporal no tiene permisos de escritura.
Siempre verifica el valor de retorno antes de usar el manejador, porque pasar false a funciones como fwrite() genera un TypeError en PHP 8+.
Ejemplos de Uso de tmpfile()
Ejemplo 1: Escribir, Leer de Vuelta y Limpieza Automática
El patrón más común: abrir un archivo temporal, escribir en él, rebobinar el puntero y leerlo de vuelta. Observa la llamada a rewind() — después de escribir, el puntero interno se encuentra al final de los datos, así que sin rebobinar fread() devolvería una cadena vacía.
<?php
$handle = tmpfile();
if ($handle === false) {
die('Failed to create temporary file');
}
fwrite($handle, 'Example data');
rewind($handle); // move pointer back to the beginning
echo fread($handle, 1024); // read up to 1024 bytes
fclose($handle); // closing also deletes the fileSalida:
Example dataEl archivo se elimina en el momento en que se ejecuta fclose(), por lo que no hay nada que limpiar manualmente.
Ejemplo 2: Encontrar la Ruta Real del Archivo Temporal
Aunque tmpfile() oculta el nombre del archivo, puedes recuperarlo a través de los metadatos del flujo con stream_get_meta_data(). Esto es útil para registros o depuración — por ejemplo, para confirmar que el archivo realmente desaparece.
<?php
$handle = tmpfile();
$meta = stream_get_meta_data($handle);
$path = $meta['uri'];
echo 'Temp file exists before close: ';
echo file_exists($path) ? 'yes' : 'no';
echo "\n";
fclose($handle);
echo 'Temp file exists after close: ';
echo file_exists($path) ? 'yes' : 'no';
echo "\n";Salida:
Temp file exists before close: yes
Temp file exists after close: noEjemplo 3: Almacenar Filas CSV en Búfer Antes de Enviar
Un caso de uso realista: crear un CSV en un archivo temporal usando fputcsv(), luego leer todo de vuelta para devolverlo o transmitirlo. Esto mantiene los datos grandes fuera de la memoria mientras te permite ensamblarlos línea a línea.
<?php
$rows = [
['Name', 'Role'],
['Ada', 'Engineer'],
['Linus', 'Maintainer'],
];
$handle = tmpfile();
foreach ($rows as $row) {
fputcsv($handle, $row);
}
rewind($handle);
echo stream_get_contents($handle); // read everything from the pointer to EOF
fclose($handle);Salida:
Name,Role
Ada,Engineer
Linus,Maintainertmpfile() vs tempnam()
Ambas crean archivos temporales, pero resuelven problemas diferentes:
| Aspecto | tmpfile() | tempnam() |
|---|---|---|
| Devuelve | Un manejador de archivo abierto | Un nombre de archivo (string) |
| ¿Abre el archivo? | Sí (w+) | No — tú llamas a fopen() tú mismo |
| ¿Se elimina automáticamente? | Sí, al cerrar / finalizar el script | No — debes usar unlink() |
| ¿Conoces la ruta? | Solo mediante stream_get_meta_data() | Sí, directamente |
Regla general: usa tmpfile() para datos de trabajo autocontenidos dentro de un script; usa tempnam() cuando necesites un archivo con nombre para pasarlo a otro proceso o conservarlo después de la solicitud.
Errores Comunes
- Olvidar
rewind(). Después de escribir, el puntero está al final. Leer sin rebobinar no devuelve nada. - Asumir un valor de retorno. En un directorio temporal de solo lectura,
tmpfile()devuelvefalse; siempre protégete contra ello. - Esperar que el archivo persista. Una vez que el manejador se cierra, el archivo desaparece — copia los datos (con
fopen()a una ruta permanente,file_put_contents(), etc.) si necesitas conservarlos.
Conclusión
La función tmpfile() es la forma más sencilla de obtener un archivo de trabajo privado y auto-limpiable en PHP. Te proporciona un manejador de lectura y escritura, coloca el archivo de forma segura en el directorio temporal del sistema, y lo elimina en el momento en que cierras el manejador o finaliza el script — sin necesidad de mantenimiento manual. Úsala cuando necesites almacenamiento de corta duración y no te importe el nombre del archivo; usa tempnam() cuando sí te importe.