fclose()
La funzione fclose() in PHP chiude un puntatore a file aperto. È essenziale per gestire le risorse di sistema in modo corretto.
Introduzione alla funzione PHP fclose()
La funzione fclose() chiude un puntatore a file precedentemente aperto con fopen(). Un puntatore a file (chiamato anche handle o risorsa stream) è il valore che PHP restituisce quando apre un file; ogni operazione di lettura e scrittura lo utilizza per tenere traccia della posizione corrente nel file.
Chiudere un handle quando si ha finito di usarlo è importante per due motivi:
- Svuota il buffer di scrittura. PHP e il sistema operativo non scrivono necessariamente ogni byte su disco immediatamente — i dati vengono tenuti in un buffer per motivi di prestazioni.
fclose()forza la scrittura di qualsiasi output memorizzato nel buffer, quindi un file dimenticato aperto potrebbe mancare dei suoi ultimi byte. - Libera le risorse di sistema. Ogni file aperto consuma un file descriptor del sistema operativo. Uno script a lunga esecuzione (o un ciclo che apre file senza chiuderli) può esaurire il limite dei descriptor e iniziare a fallire con "Too many open files".
PHP chiude automaticamente ogni handle ancora aperto alla fine dello script, quindi raramente si perdono dati in uno script breve. Tuttavia si dovrebbe comunque chiudere gli handle esplicitamente — specialmente nei cicli e nei processi a lunga esecuzione — in modo che le risorse vengano rilasciate il prima possibile.
Sintassi
fclose(resource $stream): bool$stream— il puntatore al file aperto che si vuole chiudere.
Parametri
La funzione fclose() accetta un solo parametro obbligatorio:
$stream: Il puntatore al file che si vuole chiudere. Deve essere una risorsa valida e aperta restituita dafopen(),fsockopen(),popen()o una funzione simile. Passare una risorsa non valida o già chiusa genera unTypeError(PHP 8+) oppure un avviso (PHP 7), e la funzione restituiscefalse.
Valori restituiti
Restituisce true in caso di successo o false in caso di errore.
Esempi
Esempio 1: Aprire, scrivere e chiudere un file
Il pattern più comune è aprire un file, lavorarci e poi chiuderlo. La chiusura svuota il testo memorizzato nel buffer su disco:
Scrivere su un file e chiudere l'handle
<?php
$handle = fopen("notes.txt", "w"); // open for writing (creates/empties the file)
fwrite($handle, "Hello, fclose!\n");
fclose($handle); // flush + release the handle
echo "File written and closed.";Output:
File written and closed.Esempio 2: Verificare sempre che il file sia stato aperto
fopen() restituisce false se il file non può essere aperto (file mancante, nessun permesso). Chiudere false è un errore, quindi controlla prima l'handle:
Proteggere contro un'apertura fallita
<?php
$handle = fopen("data.txt", "r");
if ($handle === false) {
echo "Could not open the file.";
} else {
// ... read from the file ...
fclose($handle);
echo "Done.";
}Esempio 3: Chiudere all'interno di un ciclo
Quando si elaborano molti file, chiudi ogni handle non appena hai finito così i descriptor non si accumulano:
Chiudere ogni handle all'interno del ciclo
<?php
$files = ["a.txt", "b.txt", "c.txt"];
foreach ($files as $name) {
$handle = fopen($name, "r");
if ($handle !== false) {
// ... process the file ...
fclose($handle); // closed before the next iteration opens another
}
}Esempio 4: Verificare il valore restituito
Nel codice in cui una chiusura fallita è rilevante (ad esempio, la scrittura su un flusso di rete), ispeziona il valore restituito:
Gestire una chiusura fallita
<?php
$handle = fopen("report.txt", "w");
fwrite($handle, "Generated report\n");
if (fclose($handle) === false) {
echo "Failed to close the file — data may not have been saved.";
} else {
echo "File saved successfully.";
}Errori comuni
- Non usare un handle dopo averlo chiuso. Una volta eseguita
fclose(), la risorsa non è più valida; chiamare nuovamentefread(),fwrite()ofclose()su di essa fallisce. - Una
fclose()per ognifopen(). Chiudere lo stesso handle due volte genera un errore alla seconda chiamata. fclose()non elimina il file. Rilascia solo il puntatore. Usaunlink()per rimuovere un file dal disco.- La chiusura automatica non è gratuita. Affidarsi alla chiusura automatica di PHP a fine script va bene per script piccoli, ma un ciclo che apre senza chiudere può raggiungere il limite dei file descriptor del sistema operativo ben prima che lo script termini.
Funzioni correlate
fopen()— apre un file e restituisce l'handle chefclose()chiuderà in seguito.fwrite()— scrive dati su un handle aperto.fread()/fgets()— legge da un handle aperto.feof()— verifica se si è raggiunta la fine del file.PHP File Handling— il quadro completo del lavoro con i file.
Conclusione
fclose() chiude un puntatore a file aperto, svuotando eventuali scritture nel buffer e rilasciando la risorsa di sistema sottostante. Sebbene PHP chiuda gli handle automaticamente al termine dello script, chiuderli esplicitamente — specialmente all'interno di cicli e script a lunga esecuzione — evita l'esaurimento dei file descriptor e garantisce che i dati raggiungano il disco. Abbina ogni fopen() a un fclose(), e proteggiti da un'apertura fallita prima di leggere, scrivere o chiudere.