PHP mette a disposizione due modi per memorizzare informazioni e sono tramite file o database.
Grazie ai file possono contenere qualsiasi tipo di dati, oltre che numerose informazioni sui file stessi. Il linguaggio offre numerose funzioni per la gestione del file system.
Ora spieghero' l'apertura, lettura, scrittura e chiusura di file su disco.
Prima di andare avanti, introduciamo un concetto fondamentale per poter capire come lavorare con i file in PHP: il puntatore al file.
Puntatore al file
Il puntatore al file o descrittore di file è un numero intero assegnato al file al momento della sua apertura. Esso consente di riferirsi univocamente a tale file fino alla sua chiusura.
Dopo l'apertura, per poter effettuare operazioni sul file non dobbiamo più usare il suo nome ma fare riferimento al suo puntatore.
Per operare sui file è necessario avere accesso al loro descrittore, un record logico contentente informazioni sul file stesso:
- nome del file
- tipo del file
- la sua dimensione
- informazioni sui permessi di accesso al file
- la data di creazione
- la data dell'ultima modifica
Tali descrittori sono memorizzati su disco fisso in apposite aree chiamate directory (o tabelle dei descrittori), che sono file a loro volta.
Le directory hanno una struttura gerarchica rappresentabile come un albero, dove la directory principale è la radice (root) e via via scendendo ci sono le altre directory.
Aprire un file con fopen()
Per aprire un file in PHP possiamo utilizzare la funzione fopen(), come mostrato nel seguente esempio
<?php $filename = 'file.txt'; $handler = fopen($filename, 'r+'); if (false === $handler) { printf('Impossibile aprire il file %s', $filename); exit; } fclose($handler);
La funzione fopen()
prende due parametri:
- il file che vogliamo aprire
- la modalità di apertura
e restituisce il puntatore al file aperto (nell'esempio abbiamo memorizzato tale puntatore nella variabile $handler). La funzione restituisce false in caso di errore nell'apertura del file.
Chiudere un file con fclose()
Dopo aver terminato di lavorare su un file, questo deve essere chiuso in qualche modo poiché occupa risorse e appesantisce il carico del server.
In PHP è la funzione fclose()
che si occupa di chiudere un file per liberare la memoria. Essa prende come parametro il puntatore al file, come mostrato alla riga 10 dell'esempio precedente e ritorna true
in caso di successo.
Modalità di apertura file
Nell'esempio precedente abbiamo aperto il file in modalità r+
, ossia in lettura e scrittura.
Nella seguente tabella sono riportate le possibili modalità di apertura di un file con fopen()
Modalità | Descrizione |
---|---|
r |
Apre il file in lettura posizionando il puntatore all'inizio del file |
r+ |
Apre il file in lettura e scrittura posizionando il puntatore all'inizio del file |
w |
Apre il file in scrittura posizionando il puntatore all'inizio del file. Cancella il contenuto del file. Se il file non esiste lo crea. |
w+ |
Apre il file in lettura e scrittura posizionando il puntatore all'inizio del file. Cancella il contenuto del file. Se il file non esiste lo crea. |
a |
Apre il file in scrittura posizionando il puntatore alla fine del file. Se il file non esiste lo crea. |
a+ |
Apre il file in lettura e scrittura posizionando il puntatore alla fine del file. Se il file non esiste lo crea. |
x |
Crea e apre un file in scrittura posizionando il puntatore all'inizio del file. Ritorna false e genera un E_WARNING se il file esiste già. |
x+ |
Crea e apre un file in lettura e scrittura posizionando il puntatore all'inizio del file. Ritorna false e genera un E_WARNING se il file esiste già. |
c |
Apre il file in scrittura e, se non esiste, lo crea. Se il file esiste già il contenuto esistente viene preservato e il puntatore posizionato all'inizio del file. Questa modalità è utile nel caso di lock su file. Per approdondire leggi la documentazione per flock() |
c+ |
Apre un file in lettura e scrittura. Vedi modalità c. |
Funzione file_exists()
Se proviamo ad aprire un file che non esiste, PHP genera un messaggio di avviso simile al seguente
PHP Warning: fopen(file.txt): failed to open stream: No such file or directory in...
Per evitare ciò, PHP mette a disposizione la funzione file_exists()
che verifica l'esistenza di un file ritornando true
oppure false
.
<?php $filename = 'files.txt'; if (false === file_exists($filename)) { printf('Il file %s non esiste', $filename); } ?>
La funzione accetta due parametri: il puntatore al file e il numero di byte da leggere.
Vediamo un esempio pratico
<?php $filename = 'file.txt'; $handler = fopen($filename, 'r'); if (false === $handler) { printf('Impossibile aprire il file %s', $filename); exit; } $size = 1024; while (!feof($handler)) { $content = fread($handler, $size); echo $content; } fclose($handler);
Dopo aver verificato l'esistenza del file, tramite un ciclo while leggiamo l'intero contenuto del file verificando ad ogni ciclo che non sia stata la raggiunta la fine del file tramite la funzione feof().
In questo esempio abbiamo utilizzato il valore 1024 come secondo parametro per la funzione fread(). Un valore più alto consentirebbe un'esecuzione più rapida dello script, ma consumerebbe più RAM ad ogni ciclo.
È dunque importante verificare di avere sufficiente memoria a disposizione prima di incrementare il numero di byte da estrarre dal file.
Scrivere in un file con fwrite()
Per scrivere dati in un file possiamo utilizzare la funzione fwrite().
La funzione accetta due parametri:
il puntatore al file
la stringa di testo da scrivere nel file
Se l'operazione avviene correttamente la funzione ritorna il numero di byte scritti, altrimenti false.
Di seguito è mostrato un esempio
È dunque importante verificare di avere sufficiente memoria a disposizione prima di incrementare il numero di byte da estrarre dal file. Scrivere in un file con fwrite() Per scrivere dati in un file possiamo utilizzare la funzione fwrite(). La funzione accetta due parametri: il puntatore al file la stringa di testo da scrivere nel file Se l'operazione avviene correttamente la funzione ritorna il numero di byte scritti, altrimenti false. Di seguito è mostrato un esempio <?php $filename = 'file.txt'; $handler = fopen($filename, 'w+'); if (false === $handler) { printf('Impossibile aprire il file %s', $filename); exit; } for ($i = 1; $i <= 100; $i++) { fwrite($handler, "Riga $i\n"); // Scrive la stringa nel file 100 volte } fclose($handler);
Lo script scrive nel file 100 volte la stringa "Riga $i", con la variabile $i che viene incrementata di una unità ad ogni iterazione.
Avendo utilizzato la modalità di apertura w+, tutto il contenuto precedente del file verrà perso. Se il file non esiste, verrà creato.
Funzioni file_get_contents e file_put_contents
Per leggere e scrivere informazioni in un file, il linguaggio offre due alternative alle funzioni appena viste: file_get_contents() per leggere il contenuto di un file e file_put_contents() per scrivere in un file.
La funzione file_get_contents() prende come parametro il nome del file e restituisce il numero di byte in esso contenuti in formato stringa. In caso di errore la funzione ritorna false.
Ecco un esempio di utilizzo
<?php $filename = 'file.txt'; $content = file_get_contents($filename); if (false === $content) { printf('Impossibile leggere il file %s', $filename); exit; } print_r($filename);
La funzione file_put_contents() prende in input due parametri:
il percorso del file in cui scrivere
la stringa da inserire nel file
La funzione file_put_contents() prende in input due parametri:
il percorso del file in cui scrivere
la stringa da inserire nel file
<?php $filename = 'file.txt'; $text = 'Questo è un test'; $bytes = file_put_contents($filename, $text); if (false === $bytes) { printf('Impossibile scrivere nel file %s', $filename); exit; } print_r($bytes);
La funzione file_put_contents() prende in input due parametri:
- il percorso del file in cui scrivere
- la stringa da inserire nel file
<?php $filename = 'file.txt'; $text = 'Questo è un test'; $bytes = file_put_contents($filename, $text); if (false === $bytes) { printf('Impossibile scrivere nel file %s', $filename); exit; } print_r($bytes);
La funzione file_get_contents()
può essere utilizzata per leggere il codice sorgente, come mostrato nell'esempio seguente
<?php $homepage = file_get_contents('https://www.google.it/'); echo $homepage; // <!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="it">...