fwrite()
La funzione fwrite() è una funzione PHP integrata che scrive dati su un file, a partire dalla posizione corrente del puntatore di file.
Cos'è la funzione fwrite()?
fwrite() è una funzione PHP integrata che scrive una string in un file aperto. La scrittura inizia dalla posizione corrente del puntatore di file e fa avanzare quel puntatore del numero di byte scritti, quindi le chiamate consecutive si accodano l'una all'altra invece di sovrascriversi. È il metodo standard di basso livello per scrivere su file in PHP ed è comunemente disponibile anche come fputs() (le due funzioni sono identiche).
Questa pagina tratta la sintassi, l'argomento opzionale length, le modalità di file che controllano dove e come vengono scritti i dati, i valori restituiti, la gestione degli errori e le operazioni quotidiane per cui si utilizzerà fwrite().
Sintassi
fwrite(resource $stream, string $data, ?int $length = null): int|false| Parametro | Obbligatorio | Descrizione |
|---|---|---|
$stream | Sì | Un puntatore di file (resource) restituito da fopen(). |
$data | Sì | La string da scrivere. |
$length | No | Se specificato, la scrittura si interrompe dopo $length byte — a seconda di quale condizione si verifica prima, la fine di $data o questo limite. |
Valore restituito: il numero di byte effettivamente scritti, oppure false in caso di errore. Poiché su alcuni stream è possibile una scrittura parziale (meno byte di strlen($data)), il codice robusto verifica il valore restituito invece di presumere il successo.
Nella maggior parte dei casi l'argomento
lengthnon è necessario.fwrite($file, $data)scrive già l'intera string. Passare una lunghezza solo quando si vuole deliberatamente troncare l'output ai primi N byte.
Un Esempio di Base
<?php
$filename = 'myfile.txt';
$file = fopen($filename, 'w'); // open for writing (truncates the file)
if ($file === false) {
exit("Could not open $filename for writing");
}
$bytes = fwrite($file, "Hello, world!");
fclose($file);
echo "Wrote $bytes bytes."; // Wrote 13 bytes.Sono sempre coinvolti tre passaggi:
- Aprire il file con
fopen()in una modalità che consenta la scrittura. - Chiamare
fwrite()una o più volte per inviare dati allo stream. - Chiudere il file con
fclose()per svuotare il buffer e rilasciare l'handle.
"Hello, world!" contiene 13 caratteri, quindi fwrite() restituisce 13.
Modalità di File: Dove Vanno i Byte
Il comportamento di fwrite() è determinato quasi interamente dalla modalità passata a fopen(). Questa è la fonte più comune di confusione, quindi vale la pena memorizzarla:
| Modalità | Significato | Contenuto esistente |
|---|---|---|
'w' | Solo scrittura | Troncato a vuoto, poi scritto dall'inizio |
'w+' | Lettura + scrittura | Troncato, poi scritto |
'a' | Solo accodamento | Conservato; ogni scrittura va alla fine |
'a+' | Lettura + accodamento | Conservato; le scritture vanno alla fine |
'x' | Scrittura esclusiva | Fallisce se il file esiste già (impedisce sovrascritture) |
'r+' | Lettura + scrittura | Conservato; le scritture iniziano dall'inizio, sovrascrivendo byte per byte |
Se il file risulta vuoto o perde i dati precedenti, quasi certamente è stato aperto con 'w' quando si intendeva usare 'a'.
Accodamento Instead of Overwriting
<?php
$log = fopen('app.log', 'a'); // 'a' keeps existing lines
fwrite($log, "User logged in\n"); // \n adds a newline
fwrite($log, "Order placed\n");
fclose($log);Ogni esecuzione di questo script aggiunge altre due righe ad app.log invece di azzerarlo.
Scrittura di Più Righe
fwrite() scrive esattamente i byte forniti — non aggiunge interruzioni di riga. Bisogna includere \n manualmente (dentro virgolette doppie, affinché l'escape venga interpretato):
<?php
$file = fopen('names.txt', 'w');
$names = ['Alice', 'Bob', 'Carol'];
foreach ($names as $name) {
fwrite($file, $name . PHP_EOL); // PHP_EOL = OS-correct line ending
}
fclose($file);PHP_EOL corrisponde a \n su Unix/macOS e \r\n su Windows, rendendo i file di testo portabili.
Verificare Sempre il Valore Restituito
Disco pieno, problemi di permessi e pipe interrotte possono causare la mancata riuscita o il completamento parziale della scrittura. Trattare il valore restituito come fonte di verità:
<?php
$file = fopen('report.txt', 'w');
if ($file === false) {
throw new RuntimeException('Unable to open report.txt');
}
$data = str_repeat('x', 1000);
$written = fwrite($file, $data);
if ($written === false || $written < strlen($data)) {
fclose($file);
throw new RuntimeException('Write failed or incomplete');
}
fclose($file);
echo "OK: $written bytes written";fwrite() vs file_put_contents()
Per una singola scrittura immediata, file_put_contents() è più conciso — apre, scrive e chiude con una sola chiamata:
<?php
// Equivalent of the basic example above, in one line:
file_put_contents('myfile.txt', 'Hello, world!');Preferire fwrite() quando si ha bisogno di mantenere il file aperto durante molte scritture (cicli, streaming, logging), passare opzioni come il blocco, o scrivere in modo incrementale senza ricostruire l'intera string in memoria.
Insidie Comuni
'w'tronca immediatamente — nel momento in cuifopen($f, 'w')ha successo, il contenuto precedente è perso, anche se non si chiama maifwrite().- Nessuna interruzione di riga automatica — bisogna aggiungere
\n/PHP_EOLmanualmente. - Dimenticare
fclose()— i dati possono rimanere in un buffer e non raggiungere mai il disco finché l'handle non viene chiuso (o lo script non termina). - Le virgolette singole non espandono gli escape —
'Line\n'scrive un backslash letterale seguito da n. Usare"Line\n"per un vero a capo. - Il limite di
lengthè in byte — con testo UTF-8 multi-byte, un limite in byte può spezzare un carattere a metà.
Conclusione
fwrite() è la funzione principale di PHP per scrivere string in un file aperto. Padroneggiare il ciclo in tre fasi apri–scrivi–chiudi, scegliere la modalità fopen() corretta ('w' per sostituire, 'a' per accodare), aggiungere manualmente le interruzioni di riga e verificare il valore restituito permette di scrivere qualsiasi cosa, dai semplici file di testo ai log applicativi durevoli.
Funzioni Correlate
fopen()— aprire il file prima di scriverefclose()— svuotare e chiudere l'handle in seguitofread()efgets()— leggere i dati indietrofile_put_contents()— scrivere un intero file con una sola chiamatafeof()— rilevare la fine di un file durante la lettura