W3docs

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:

  1. Helper one-shotfile_get_contents() e file_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.
  2. Funzioni basate su handlefopen(), fread(), fwrite() e fclose() 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(): Restituisce true quando è 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 con fclose() in modo che le scritture bufferizzate vengano scaricate e la risorsa venga rilasciata.
  • Controlla i valori di ritorno. fopen(), mkdir() e unlink() restituiscono false in 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 famiglia fopen()/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.

Esercitazione

Pratica
Quali funzioni possono essere utilizzate in PHP per gestire file e directory?
Quali funzioni possono essere utilizzate in PHP per gestire file e directory?
Was this page helpful?