Gestione dei File in PHP
PHP offre vari modi per manipolare file e cartelle sul server. In questo articolo discutiamo le funzionalità di gestione dei file di PHP.
La gestione dei file è una delle operazioni più comuni nella programmazione lato server: la scrittura di log, la generazione di report, la memorizzazione nella cache, l'importazione di file CSV e la distribuzione di download dipendono tutte da essa. PHP include un ricco insieme di funzioni native per lavorare con i file, quindi raramente è necessaria una libreria esterna.
Questo capitolo copre l'intero ciclo di vita di un file — creazione, lettura, aggiornamento ed eliminazione (CRUD) — e spiega quando ricorrere a ciascun approccio. In generale, PHP offre due stili:
- Helper per file interi (
file_get_contents(),file_put_contents()) — una sola riga, ideali per file piccoli che possono essere tenuti in memoria. - Funzioni basate su stream (
fopen(),fread(),fwrite(),fgets(),fclose()) — forniscono un handle che consente di leggere o scrivere un file di grandi dimensioni a pezzi senza caricarlo tutto in una volta.
Sapere quale usare fa la differenza tra codice che funziona su un file di configurazione da 2 KB e codice che regge un file di log da 2 GB.
Modalità di apertura file
Ogni chiamata basata su stream inizia con fopen($filename, $mode), e la modalità è la parte che i principianti sbagliano più spesso. Determina se il file viene aperto in lettura, scrittura o entrambe, se il contenuto esistente viene cancellato e dove inizia il puntatore interno.
| Modalità | Lettura | Scrittura | Puntatore | Se il file non esiste | Contenuto esistente |
|---|---|---|---|---|---|
"r" | sì | no | inizio | avviso, restituisce false | mantenuto |
"r+" | sì | sì | inizio | avviso, restituisce false | mantenuto |
"w" | no | sì | inizio | creato | cancellato (troncato) |
"w+" | sì | sì | inizio | creato | cancellato (troncato) |
"a" | no | sì | fine | creato | mantenuto (aggiunge in coda) |
"a+" | sì | sì | fine | creato | mantenuto (aggiunge in coda) |
"x" | no | sì | inizio | creato | fallisce se il file esiste già |
Aggiungere "b" (es. "rb", "wb") per l'accesso sicuro in binario quando si lavora con immagini, PDF o qualsiasi dato non testuale — evita la traduzione dei terminatori di riga su Windows.
Creazione e scrittura di un file
Per creare un file lo si apre in modalità scrittura con fopen() e si scrive con fwrite(). Chiudere sempre l'handle con fclose() al termine — questo svuota il buffer su disco e libera la risorsa.
<?php
$file = fopen("test.txt", "w"); // create/truncate, open for writing
fwrite($file, "Hello World\n");
fwrite($file, "Second line\n"); // each call appends after the previous one
fclose($file); // flush to disk and release the handleL'apertura con "w" cancella qualsiasi contenuto esistente. Per aggiungere al file senza distruggere ciò che già contiene, aprirlo in modalità append ("a"):
<?php
$log = fopen("app.log", "a"); // pointer starts at end of file
fwrite($log, "User logged in at " . date("H:i:s") . "\n");
fclose($log);Per una soluzione rapida in una sola riga quando si ha l'intera stringa in memoria, saltare completamente l'handle e usare file_put_contents():
<?php
file_put_contents("test.txt", "Hello World\n"); // overwrite
file_put_contents("app.log", "another line\n", FILE_APPEND); // appendVerificare sempre il valore restituito da
fopen(). Se il percorso è errato o la directory non è scrivibile, restituiscefalsee PHP emette un avviso — usarefalsecome handle fallirà silenziosamente.
<?php
$file = fopen("/protected/test.txt", "w");
if ($file === false) {
die("Could not open the file for writing.");
}
fwrite($file, "data");
fclose($file);Lettura di un file
Il modo più semplice per leggere un file piccolo è file_get_contents(), che restituisce l'intero contenuto come unica stringa:
<?php
$content = file_get_contents("test.txt");
echo $content; // prints everything in the fileQuando il file è grande, caricare tutto in memoria è uno spreco. Leggerlo riga per riga con fgets(), iterando fino a quando feof() (fine del file) non è raggiunta:
<?php
$file = fopen("test.txt", "r");
while (!feof($file)) {
$line = fgets($file); // reads one line, including the newline
echo $line;
}
fclose($file);Se si vuole ogni riga come elemento di un array in una sola chiamata, file() è comoda — ma, come file_get_contents(), carica l'intero file in memoria:
<?php
$lines = file("test.txt"); // array, one element per line
echo "This file has " . count($lines) . " lines.";Una buona abitudine è verificare l'esistenza di un file prima di leggerlo, usando file_exists() (o is_readable() per controllare anche i permessi):
<?php
if (file_exists("test.txt")) {
echo file_get_contents("test.txt");
} else {
echo "File not found.";
}Aggiornamento di un file
Per sostituire il contenuto di un file, lo strumento più pulito è file_put_contents(). Apre, scrive e chiude in una sola chiamata:
<?php
$content = "Hello World Again\n";
file_put_contents("test.txt", $content); // replaces the old contentsPer aggiungere a un file anziché sostituirlo, passare il flag FILE_APPEND (mostrato sopra) o aprirlo in modalità append con fopen(). Non esiste una funzione "modifica la riga 3" — per modificare parte di un file si legge solitamente il file, si modificano i dati in PHP e lo si riscrive.
Eliminazione di un file
Usare unlink() — notare il nome insolito — per rimuovere un file. Restituisce true in caso di successo e false in caso di fallimento, quindi proteggerlo con file_exists() per evitare un avviso:
<?php
if (file_exists("test.txt")) {
if (unlink("test.txt")) {
echo "File deleted.";
} else {
echo "Could not delete the file.";
}
} else {
echo "Nothing to delete.";
}unlink() rimuove solo i file. Per eliminare una directory vuota usare rmdir(); consultare PHP Directory per lavorare con le cartelle.
Quando usare quale approccio
- File di testo/configurazione piccoli, intero contenuto in una volta →
file_get_contents()/file_put_contents(). - File grandi, streaming riga per riga →
fopen()+fgets()/fread(). - Aggiunta a un log → modalità
"a", oppureFILE_APPEND. - Creazione di un file solo se non esiste ancora → modalità
"x". - Dati binari (immagini, PDF) → aggiungere il flag
"b"e usarefread()/fwrite().
Riepilogo
La gestione dei file è una parte fondamentale di PHP lato server. Si sono apprese le due famiglie di funzioni — gli helper one-line per file interi e le funzioni stream con handle — e quando ciascuna è appropriata, come le modalità di apertura file controllano il troncamento e l'accodamento, come leggere in modo efficiente i file grandi con fgets()/feof(), e come aggiornare ed eliminare i file in modo sicuro.
Per approfondire, esplorare i capitoli dedicati: Create and Write a File, Open and Read a File, PHP Filesystem functions, File Upload e PHP Directory.