Menu

PHP file_get_contents(): leggere un file in una stringa

file_get_contents('notes.txt') legge un intero file e lo restituisce come un'unica stringa, oppure false se non ci riesce. La sua compagna file_put_contents() scrive una stringa in un file, e file() restituisce le righe come array.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

file_get_contents('notes.txt') legge l'intero file e lo restituisce come un'unica stringa. Se il file non si può leggere restituisce false. Per scrivere, usa file_put_contents('notes.txt', $text), che crea il file o ne sostituisce il contenuto.

Output:

Buy milk
Call Ada
Write docs
29 bytes
3 lines

Il blocco scrive prima notes.txt e poi lo rilegge, così ha un file su cui lavorare. Un percorso come 'notes.txt' è relativo alla cartella di lavoro corrente; in un'applicazione web, costruisci il percorso a partire dalla cartella dello script con __DIR__ . '/notes.txt'.

Scrivere e aggiungere con file_put_contents()

file_put_contents() restituisce il numero di byte scritti, oppure false in caso di errore. Di default sovrascrive il file. Il flag FILE_APPEND aggiunge invece in fondo, ed è così che funzionano i log semplici, e LOCK_EX impedisce a due richieste di scrivere nello stesso momento:

Output:

Wrote 8 bytes
started
step 1 done
step 2 done

replaced

abc
5 bytes

Per salvare un array e riaverlo come array, scrivilo come JSON con json_encode() e leggilo con json_decode().

Leggere un file riga per riga con file()

file() legge un file in un array con una riga per elemento. Ogni riga mantiene l'a capo finale a meno che tu non passi FILE_IGNORE_NEW_LINES, e FILE_SKIP_EMPTY_LINES scarta le righe vuote (funziona solo insieme a FILE_IGNORE_NEW_LINES):

Output:

string(9) "Buy milk
"
1. Buy milk
2. Call Ada
3. Write docs
3 tasks

file() e file_get_contents() caricano l'intero file in memoria. Va bene per file di configurazione e log di qualche megabyte. Per un file di centinaia di megabyte, leggilo invece una riga alla volta con fopen() e fgets().

Verificare se un file esiste prima di leggerlo

Quando il file manca, file_get_contents() restituisce false e PHP stampa un warning:

Warning: file_get_contents(missing.txt): Failed to open stream: No such file or directory in /home/index.php on line 2

Verifica prima con is_file() (un file che esiste e non è una cartella) o file_exists() (un file o una cartella), e confronta sempre il risultato con === false, perché un file vuoto restituisce "", che è anch'esso falsy:

Output:

empty.txt   exists file 
missing.txt missing 
.           exists directory 
Cannot read missing.txt, using defaults
bool(false)
bool(true)
0 bytes

Non nascondere il warning con @file_get_contents(). Verificare prima, o gestire false, mantiene visibile l'errore quando qualcos'altro va storto.

Leggere una parte di un file

Il quarto e il quinto argomento sono l'offset in byte da cui partire e il numero di byte da leggere. Un offset negativo conta dalla fine del file. Gli argomenti con nome permettono di saltare i due argomenti intermedi:

Output:

HEADER
line 2
last line

Gli offset contano i byte, non i caratteri. In UTF-8 un carattere giapponese occupa 3 byte, quindi un offset nel mezzo di uno lo taglia a metà. Per lavorare con i caratteri, leggi l'intera stringa e usa mb_substr().

Mostrare un file di testo in una pagina web

Il contenuto di un file è testo, e il testo stampato nell'HTML deve passare per l'escape, altrimenti un < nel file diventa un tag. htmlspecialchars() applica l'escape e nl2br() trasforma gli a capo in tag <br>. Eseguilo e guarda la scheda Page:

Togli htmlspecialchars() ed eseguilo di nuovo: ora la pagina termina a "v1.2: Fixed", perché il browser legge <title> come un vero tag e inghiotte tutto ciò che segue come titolo della pagina. La pagina su htmlspecialchars() spiega perché conta per tutto ciò che un utente può scrivere.

Leggere un URL con file_get_contents()

Con allow_url_fopen attivo (il default in php.ini), file_get_contents() legge anche gli URL e restituisce il corpo della risposta. Un contesto di stream aggiunge un metodo, intestazioni, un corpo e un timeout:

<?php
$html = file_get_contents('https://example.com/');

$context = stream_context_create([
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/json\r\n",
        'content' => json_encode(['name' => 'Ada']),
        'timeout' => 5,
        'ignore_errors' => true,   // return the body of 4xx/5xx responses too
    ],
]);

$response = file_get_contents('https://api.example.com/users', false, $context);
if ($response === false) {
    // DNS failure, timeout, or a refused connection
}

Per tentativi ripetuti, redirect con limiti e codici di errore chiari, cURL o una libreria client HTTP come Guzzle sono lo strumento migliore.

file_get_contents vs file() vs fopen()

Ti serveUsaMemoria
L'intero file come un'unica stringafile_get_contents()L'intero file
Le righe come arrayfile($path, FILE_IGNORE_NEW_LINES)L'intero file
Scrivere o sostituire un file in una chiamatafile_put_contents()I dati che scrivi
Aggiungere una riga a un logfile_put_contents($path, $line, FILE_APPEND | LOCK_EX)Una riga
Leggere un file grande riga per riga, o righe CSVfopen() con fgets() o fgetcsv()Una riga
Leggere e scrivere lo stesso file apertofopen() con r+, a+ o c+Ciò che leggi

Le funzioni a chiamata singola aprono, leggono o scrivono e chiudono il file per te, quindi sono la scelta di default giusta. Usa fopen() quando il file è troppo grande per stare in memoria o devi tenerlo aperto tra un'operazione e l'altra.

Domande frequenti

Come leggo un file in una stringa in PHP?

Chiama file_get_contents('path/to/file.txt'). Restituisce l'intero file come stringa, oppure false se il file non si può leggere, quindi confronta il risultato con === false prima di usarlo.

Come aggiungo testo in fondo a un file in PHP?

Passa il flag FILE_APPEND: file_put_contents('log.txt', "new line\n", FILE_APPEND);. Senza, file_put_contents() sostituisce l'intero file. Aggiungi LOCK_EX (FILE_APPEND | LOCK_EX) quando più richieste potrebbero scrivere nello stesso momento.

Come leggo un file riga per riga in PHP?

Per i file piccoli, file('data.txt', FILE_IGNORE_NEW_LINES) restituisce un array con una riga per elemento. Per i file grandi, aprilo con fopen() e leggi una riga alla volta con fgets() in un ciclo while, che tiene in memoria una sola riga.

Perché file_get_contents restituisce false?

Il file non esiste, il percorso è relativo a una cartella diversa da quella che pensi, oppure PHP non ha il permesso di leggerlo. PHP stampa anche un warning come Failed to open stream: No such file or directory. Verifica con is_file() e is_readable(), e costruisci i percorsi a partire da __DIR__.

file_get_contents può leggere un URL?

Sì, quando allow_url_fopen è attivo in php.ini: file_get_contents('https://example.com/') restituisce il corpo della risposta. Per intestazioni, dati POST o un timeout, passa un contesto creato con stream_context_create(); per qualcosa di più complesso, cURL gestisce meglio gli errori.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA