W3docs

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:

  1. $stream: Il puntatore al file che si vuole chiudere. Deve essere una risorsa valida e aperta restituita da fopen(), fsockopen(), popen() o una funzione simile. Passare una risorsa non valida o già chiusa genera un TypeError (PHP 8+) oppure un avviso (PHP 7), e la funzione restituisce false.

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 nuovamente fread(), fwrite() o fclose() su di essa fallisce.
  • Una fclose() per ogni fopen(). Chiudere lo stesso handle due volte genera un errore alla seconda chiamata.
  • fclose() non elimina il file. Rilascia solo il puntatore. Usa unlink() 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 che fclose() 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.

Pratica

Pratica
Qual è lo scopo della funzione fclose() in PHP?
Qual è lo scopo della funzione fclose() in PHP?
Was this page helpful?