PHP Filesystem
Funzioni PHP Filesystem per creare, leggere, scrivere ed eliminare file e directory sul server con esempi pratici.
Introduzione
Le funzioni del filesystem PHP permettono agli script di leggere e scrivere sul disco del server: creare, leggere, aggiornare ed eliminare file, e gestire le directory. Sono la base di tutto ciò che deve persistere dati al di fuori di un database — file di log, report generati, file caricati dagli utenti, configurazioni, cache e operazioni di import/export.
Questo articolo spiega i due principali modi di lavorare con i file (la famiglia basata su handle costruita attorno a fopen(), e gli helper one-shot come file_get_contents()), mostra esempi eseguibili per ciascuno e indica le insidie relative ai permessi e alla gestione degli errori che creano problemi in produzione.
Due modi di lavorare con i file
PHP offre due stili, e scegliere quello giusto mantiene il codice semplice:
- Helper one-shot —
file_get_contents()efile_put_contents()leggono o scrivono un intero file in una singola chiamata. Usali quando il file entra comodamente in memoria (file di configurazione, JSON/CSV piccoli, template). Sono l'opzione più breve e leggibile. - Funzioni basate su handle —
fopen(),fread(),fwrite()efclose()forniscono un file handle (una risorsa) che si legge o scrive in modo incrementale. Usale per file di grandi dimensioni che vuoi leggere riga per riga senza caricare tutto in memoria, o quando devi tenere un file aperto per molte operazioni.
Operazioni sui file
PHP fornisce diverse funzioni per lavorare con i file. Queste funzioni consentono di creare, aprire, leggere, scrivere ed eliminare file. Le funzioni per i file più comunemente utilizzate includono:
fopen(): Apre un file e restituisce un handle. Accetta due argomenti: il nome del file e la modalità con cui aprirlo (vedi la tabella qui sotto).fclose(): Chiude un handle di file aperto e scarica le scritture bufferizzate su disco.fwrite(): Scrive una stringa in un file aperto, restituendo il numero di byte scritti.fread(): Legge un determinato numero di byte da un file aperto.feof(): Restituiscetruequando è stata raggiunta la fine del file — utile come condizione di ciclo durante la lettura.unlink(): Elimina un file.filesize(): Restituisce la dimensione di un file in byte.file_exists(): Verifica se un file o una directory esiste prima di operarci.
Per semplici operazioni di lettura/scrittura, preferisci file_get_contents() e file_put_contents(), che gestiscono apertura, lettura/scrittura e chiusura in una singola chiamata.
Modalità file per fopen()
Il secondo argomento di fopen() controlla cosa puoi fare con l'handle e cosa accade al contenuto esistente. Le modalità più comuni sono:
| Modalità | Significato |
|---|---|
"r" | Solo lettura. Il puntatore inizia dall'inizio. Fallisce se il file non esiste. |
"w" | Solo scrittura. Tronca il file a zero byte (o lo crea). |
"a" | Solo scrittura, append. Crea il file se mancante; il contenuto esistente viene preservato. |
"x" | Solo scrittura, ma fallisce se il file esiste già — modalità sicura "crea nuovo". |
"r+" | Lettura e scrittura. Puntatore all'inizio; il file deve esistere. |
Attenzione:
"w"elimina il contenuto esistente nel momento in cui apri il file. Se vuoi aggiungere a un log anziché sovrascriverlo, usa"a".
Operazioni sulle directory
PHP fornisce anche funzioni per lavorare con le directory. Queste funzioni consentono di creare, eliminare e manipolare le directory. Alcune delle funzioni per directory più comunemente utilizzate includono:
mkdir(): Questa funzione viene utilizzata per creare una directory.rmdir(): Questa funzione viene utilizzata per eliminare una directory.opendir(): Questa funzione viene utilizzata per aprire una directory.readdir(): Questa funzione viene utilizzata per leggere il contenuto di una directory.closedir(): Questa funzione viene utilizzata per chiudere una directory aperta.
Esempi
Vediamo come queste funzioni vengono utilizzate in pratica.
Creare e scrivere un file
Per creare un file e scriverci, aprilo in modalità scrittura con fopen(), scrivi con fwrite(), poi chiudi sempre con fclose():
<?php
$file = fopen("example.txt", "w");
if ($file === false) {
exit("Error opening file");
}
fwrite($file, "Hello, world!");
fclose($file);Questo crea example.txt nella stessa directory dello script (sostituendolo se esiste già), scrive Hello, world!, e chiude l'handle.
Lo stesso compito con l'helper one-shot è una singola riga — questo è lo stile preferito per i file piccoli:
<?php
file_put_contents("example.txt", "Hello, world!");Leggere un file
Per leggere un file con un handle, aprilo in modalità lettura e usa fread(). Passare filesize() indica a fread() quanti byte leggere:
<?php
$file = fopen("example.txt", "r");
if ($file === false) {
exit("Error opening file");
}
echo fread($file, filesize("example.txt"));
fclose($file);Per file piccoli, file_get_contents() fa la stessa cosa in una sola chiamata:
<?php
echo file_get_contents("example.txt");Leggere un file riga per riga
Per file di grandi dimensioni, leggi riga per riga con fgets() in modo da non tenere mai l'intero file in memoria. Il ciclo viene eseguito finché feof() non segnala la fine del file:
<?php
$file = fopen("example.txt", "r");
if ($file === false) {
exit("Error opening file");
}
while (!feof($file)) {
$line = fgets($file);
echo $line;
}
fclose($file);Aggiungere a un file
Per aggiungere a un file senza cancellare il contenuto già presente, aprilo in modalità append ("a"). Questa è la modalità giusta per i log:
<?php
$file = fopen("log.txt", "a");
fwrite($file, "New log entry\n");
fclose($file);Creare una directory
Per creare una directory, usa la funzione mkdir():
<?php
mkdir("example_directory");Questo crea una directory chiamata example_directory accanto allo script. Per creare directory annidate in una sola chiamata, passa la modalità e il flag ricorsivo:
<?php
mkdir("parent/child/grandchild", 0755, true);Nota:
mkdir()richiede il permesso di scrittura sulla directory padre. Il terzo argomento (true) abilita la creazione ricorsiva delle directory intermedie.
Eliminare un file
Per eliminare un file, usa la funzione unlink():
<?php
if (file_exists("example.txt")) {
unlink("example.txt");
}Verificare prima con file_exists() evita un avviso quando il file è già stato eliminato.
Best practice
- Chiudi sempre gli handle. Ogni
fopen()dovrebbe essere accoppiato confclose()in modo che le scritture bufferizzate vengano scaricate e la risorsa venga rilasciata. - Controlla i valori di ritorno.
fopen(),mkdir()eunlink()restituisconofalsein caso di errore — proteggiti da questo invece di dare per scontato il successo. - Attenzione ai permessi. La maggior parte degli errori "permission denied" deriva dal fatto che l'utente del server web non possiede la directory di destinazione, non dal tuo codice.
- Scegli lo strumento giusto. Usa
file_get_contents()/file_put_contents()per lavorare sull'intero file; usa la famigliafopen()/fread()solo quando hai bisogno dello streaming.
Conclusione
Le funzioni del filesystem forniscono la base per la gestione di file e directory in PHP. Comprendendo la differenza tra helper one-shot e streaming basato su handle, scegliendo la modalità fopen() corretta e chiudendo gli handle in modo sicuro, puoi creare applicazioni robuste che archiviano dati e configurazioni in modo affidabile. Per approfondire, esplora PHP File Handling, PHP File Open/Read e lavorare con le directory.