tmpfile()
La funzione tmpfile() in PHP crea un file temporaneo unico, lo apre in lettura/scrittura e lo elimina automaticamente alla chiusura.
Introduzione
Quando uno script PHP ha bisogno di uno spazio per conservare dati temporanei — un buffer troppo grande per stare in memoria, un CSV da trasmettere al browser, l'output catturato da un comando esterno — si ricorre a un file temporaneo. La funzione tmpfile() ne crea uno con una singola chiamata: crea un file univoco nella directory temporanea di sistema, lo apre in lettura e scrittura, e restituisce un handle al file. Il vantaggio principale è che si occupa anche della pulizia automatica.
Questo capitolo descrive la sintassi, il comportamento di pulizia automatica che rende tmpfile() speciale, quando usarla rispetto a tempnam(), e diversi esempi eseguibili inclusi alcuni errori comuni.
Cos'è un File Temporaneo?
Un file temporaneo è un file usato dal programma come area di lavoro e che non si intende conservare. Risiede nella directory temporanea del sistema operativo (/tmp su Linux/macOS, C:\Windows\Temp o il percorso nella variabile d'ambiente TEMP su Windows). Poiché molti processi condividono quella directory, i file temporanei necessitano di nomi univoci per evitare che due script si sovrascrivano a vicenda — tmpfile() gestisce questa unicità automaticamente.
Comprendere la Funzione tmpfile()
La funzione tmpfile() crea un file temporaneo con un nome univoco nella directory temporanea del sistema e lo apre in lettura e scrittura in modalità w+ (il file inizia vuoto, e si può sia scrivere che rileggere). Non accetta parametri.
La caratteristica principale è la pulizia automatica. Il file temporaneo viene rimosso quando:
- si chiude l'handle con
fclose(), oppure - lo script termina e l'handle esce dall'ambito.
Per questo motivo, non è quasi mai necessario eliminare il file manualmente. Il compromesso è che tmpfile() non comunica il percorso del file — l'handle è l'unico riferimento che si ottiene. Se si ha bisogno di un nome file noto da passare a un altro programma, usare tempnam().
Sintassi della Funzione tmpfile()
La sintassi della funzione tmpfile() è la seguente:
tmpfile(): resource|falseLa funzione non accetta argomenti e restituisce:
- un handle al file (resource) posizionato all'inizio del file vuoto in caso di successo, oppure
falsein caso di errore — ad esempio, quando la directory temporanea non è scrivibile.
Verificare sempre il valore restituito prima di usare l'handle, perché passare false a funzioni come fwrite() genera un TypeError in PHP 8+.
Esempi di Utilizzo di tmpfile()
Esempio 1: Scrittura, Rilettura e Pulizia Automatica
Il pattern più comune: aprire un file temporaneo, scriverci, riavvolgere il puntatore e rileggere. Notare la chiamata a rewind() — dopo la scrittura, il puntatore interno si trova alla fine dei dati, quindi senza riavvolgimento fread() restituirebbe una stringa vuota.
<?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 fileOutput:
Example dataIl file viene rimosso nel momento in cui viene eseguito fclose(), quindi non c'è nulla da pulire manualmente.
Esempio 2: Trovare il Percorso Reale del File Temporaneo
Anche se tmpfile() nasconde il nome del file, è possibile recuperarlo tramite i metadati dello stream con stream_get_meta_data(). Questo è utile per il logging o il debugging — ad esempio, per confermare che il file scompare davvero.
<?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";Output:
Temp file exists before close: yes
Temp file exists after close: noEsempio 3: Buffering di Righe CSV Prima dell'Invio
Un caso d'uso realistico: costruire un CSV in un file temporaneo usando fputcsv(), poi rileggere tutto per restituirlo o trasmetterlo. Questo mantiene i dati voluminosi fuori dalla memoria consentendo comunque di assemblarli riga per riga.
<?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);Output:
Name,Role
Ada,Engineer
Linus,Maintainertmpfile() vs tempnam()
Entrambe le funzioni creano file temporanei, ma risolvono problemi diversi:
| Aspetto | tmpfile() | tempnam() |
|---|---|---|
| Restituisce | Un handle al file aperto | Un nome file (string) |
| Apre il file? | Sì (w+) | No — si chiama fopen() manualmente |
| Eliminazione automatica? | Sì, alla chiusura / fine script | No — bisogna usare unlink() |
| Si conosce il percorso? | Solo tramite stream_get_meta_data() | Sì, direttamente |
Regola pratica: usare tmpfile() per dati di lavoro temporanei contenuti in un unico script; usare tempnam() quando si ha bisogno di un file con nome da passare a un altro processo o da conservare dopo la richiesta.
Errori Comuni
- Dimenticare
rewind(). Dopo la scrittura, il puntatore si trova alla fine. Leggere senza riavvolgere non restituisce nulla. - Non verificare il valore restituito. Se la directory temporanea è in sola lettura,
tmpfile()restituiscefalse; è necessario sempre gestire questo caso. - Aspettarsi che il file persista. Una volta chiuso l'handle, il file è sparito — copiare i dati (con
fopen()verso un percorso permanente,file_put_contents(), ecc.) se li si vuole conservare.
Conclusione
La funzione tmpfile() è il modo più semplice per ottenere un file di lavoro privato e auto-eliminabile in PHP. Fornisce un handle in lettura-scrittura, posiziona il file in sicurezza nella directory temporanea di sistema e lo elimina nel momento in cui si chiude l'handle o termina lo script — senza alcuna manutenzione manuale. Usarla quando si necessita di uno storage di breve durata senza preoccuparsi del nome del file; usare tempnam() quando il nome è importante.