W3docs

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

La funzione non accetta argomenti e restituisce:

  • un handle al file (resource) posizionato all'inizio del file vuoto in caso di successo, oppure
  • false in 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 file

Output:

Example data

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

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

tmpfile() vs tempnam()

Entrambe le funzioni creano file temporanei, ma risolvono problemi diversi:

Aspettotmpfile()tempnam()
RestituisceUn handle al file apertoUn nome file (string)
Apre il file?Sì (w+)No — si chiama fopen() manualmente
Eliminazione automatica?Sì, alla chiusura / fine scriptNo — 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() restituisce false; è 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.

Esercitazione

Pratica
Qual è la funzione di tmpfile() in PHP?
Qual è la funzione di tmpfile() in PHP?
Was this page helpful?