W3docs

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|false

La función no toma argumentos y devuelve:

  • un manejador de archivo (resource) posicionado al inicio del archivo vacío en caso de éxito, o
  • false en 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 file

Salida:

Example data

El 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:  no

Ejemplo 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,Maintainer

tmpfile() vs tempnam()

Ambas crean archivos temporales, pero resuelven problemas diferentes:

Aspectotmpfile()tempnam()
DevuelveUn manejador de archivo abiertoUn 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 scriptNo — 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() devuelve false; 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.

Práctica

Práctica
¿Cuál es la función de tmpfile() en PHP?
¿Cuál es la función de tmpfile() en PHP?
Was this page helpful?