tempnam()
In PHP, la funzione tempnam() crea un file temporaneo con nome univoco. Scopri sintassi, parametri, valori restituiti e buone pratiche.
Introduzione
tempnam() crea un file temporaneo con un nome univoco e restituisce il percorso completo verso di esso. Aspetto fondamentale: non si limita a generare un nome — il file viene effettivamente creato su disco (vuoto, con modalità 0600), eliminando così la possibilità che due processi scelgano lo stesso nome. Usala ogni volta che il tuo script ha bisogno di spazio temporaneo su disco: per bufferizzare un upload, generare un report prima di inviarlo in streaming, o passare un percorso a un comando esterno.
Questo capitolo tratta la sintassi, il valore restituito, dove viene effettivamente creato il file, le insidie comuni in produzione e come effettuare la pulizia al termine.
Sintassi
tempnam(string $directory, string $prefix): string|false| Parametro | Descrizione |
|---|---|
$directory | La directory in cui creare il file. Se non esiste o non è scrivibile, PHP ricade nella directory temporanea di sistema (sys_get_temp_dir()). |
$prefix | Un prefisso per il nome del file generato. Nella maggior parte dei sistemi vengono usati solo i primi 63 caratteri; su Windows solo i primi 3. |
Valore restituito: il percorso completo del file appena creato (ad es. /tmp/example_aB3xYz), oppure false in caso di errore.
Creazione di un file temporaneo
<?php
$tempFile = tempnam(sys_get_temp_dir(), 'example_');
echo $tempFile;
// e.g. /tmp/example_8gKq2Psys_get_temp_dir() restituisce la directory temporanea del sistema operativo (/tmp su Linux/macOS, il percorso TEMP su Windows), risultando più portabile rispetto all'uso diretto di /tmp.
Scrittura e lettura del file
tempnam() fornisce solo un percorso a un file vuoto — dovrai aprirlo per inserirvi dei dati:
<?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);Poiché tempnam() non elimina il file automaticamente, rimuovilo sempre con unlink() al termine — altrimenti i file temporanei si accumulano.
Il comportamento di fallback
Se $directory non esiste o non è scrivibile, tempnam() non fallisce direttamente — crea silenziosamente il file nella directory temporanea di sistema. Ciò significa che il percorso restituito potrebbe non trovarsi nella directory richiesta, quindi non dare mai per scontata la posizione:
<?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 backUsa sempre il percorso restituito per le operazioni successive, anziché ricostruirlo da $directory e $prefix.
tempnam() vs tmpfile()
Entrambe creano un file temporaneo univoco, ma rispondono a esigenze diverse:
tempnam()restituisce un percorso (string). Il file persiste finché non lo elimini conunlink(), e puoi passare il percorso ad altre funzioni o programmi esterni.tmpfile()restituisce un handle al file aperto, e il file viene eliminato automaticamente alla chiusura dell'handle o al termine dello script. Usala quando hai bisogno solo dell'handle e vuoi una pulizia automatica.
Scegli tempnam() quando qualcos'altro ha bisogno del nome del file; scegli tmpfile() quando hai solo bisogno di un handle temporaneo che si pulisce da solo.
Insidie comuni
- Crea il file. Il file esiste già (vuoto) dopo la chiamata, quindi controllare
file_exists()sul risultato restituisce sempre true. Per rilevare un errore, confronta invece il risultato confalse. - Elimina sempre il file. I file temporanei non vengono rimossi automaticamente. Abbina sempre ogni
tempnam()a ununlink(), idealmente in un bloccofinally. - Non fidarti della directory. A causa del fallback, il file potrebbe non trovarsi dove hai richiesto. Usa il percorso restituito.
- Il prefisso viene troncato. I prefissi lunghi vengono abbreviati (3 caratteri su Windows), quindi non fare affidamento sul prefisso completo nel nome del file.
Conclusione
tempnam() crea in modo sicuro un file temporaneo con nome univoco e vuoto, restituendone il percorso. Ricorda che crea il file (non solo un nome), può ricadere nella directory temporanea di sistema e non effettua mai la pulizia autonomamente — quindi lavora sempre con il percorso restituito e chiama unlink() al termine. Quando hai bisogno solo di un handle che si elimina da solo, preferisci tmpfile().