PHP mette a disposizione due modi per memorizzare informazioni in maniera persistente su disco: file e database. In questa guida analizziamo i file, mentre rimandiamo l'argomento database in una prossima guida dedicata.
I 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.
Questa guida è dedicata in particolare all'apertura, lettura, scrittura e chiusura di file su disco. Nella guida successiva vedremo invece le funzioni del linguaggio per gestire le directory ed ulteriori funzioni per la gestione dei file.
Prima di andare avanti, introduciamo un concetto fondamentale per poter capire come lavorare con i file in PHP: il puntatore al file.
Indice dei contenuti
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:
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.
Per poter compiere operazioni sui file è necessario quindi caricare in memoria il descrittore del file, operazione che prende il nome di apertura del file.
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:
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.
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.
Nota: sebbene PHP chiuda automaticamente tutti i file aperti al termine dell'esecuzione degli script, è buona prassi per un programmatore chiuderli all'interno dell'applicazione stessa per renderli disponibili ad altri processi o script che ne facciano richiesta.
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 . |
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
.
Di seguito un esempio
<?php
$filename = 'files.txt';
if (false === file_exists($filename)) {
printf('Il file %s non esiste', $filename);
}
La funzione fread()
consente di leggere dal file un numero definito di byte e li restituisce sotto forma di stringa di testo.
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.
Per scrivere dati in un file possiamo utilizzare la funzione fwrite()
.
La funzione accetta due parametri:
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.
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:
<?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 di una pagina web, 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">...
Nella guida successiva faremo una panoramica delle funzioni PHP più usate per eseguire operazioni su file.