W3docs

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àLetturaScritturaPuntatoreSe il file non esisteContenuto esistente
"r"noinizioavviso, restituisce falsemantenuto
"r+"inizioavviso, restituisce falsemantenuto
"w"noiniziocreatocancellato (troncato)
"w+"iniziocreatocancellato (troncato)
"a"nofinecreatomantenuto (aggiunge in coda)
"a+"finecreatomantenuto (aggiunge in coda)
"x"noiniziocreatofallisce 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 handle

L'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); // append

Verificare sempre il valore restituito da fopen(). Se il percorso è errato o la directory non è scrivibile, restituisce false e PHP emette un avviso — usare false come 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 file

Quando 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 contents

Per 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 voltafile_get_contents() / file_put_contents().
  • File grandi, streaming riga per rigafopen() + fgets() / fread().
  • Aggiunta a un log → modalità "a", oppure FILE_APPEND.
  • Creazione di un file solo se non esiste ancora → modalità "x".
  • Dati binari (immagini, PDF) → aggiungere il flag "b" e usare fread()/fwrite().

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.

Esercitazione

Pratica
Quali sono i modi corretti per aprire un file in PHP?
Quali sono i modi corretti per aprire un file in PHP?
Was this page helpful?