W3docs

Funzione PHP ob_end_flush(): Tutto Quello che Devi Sapere

Scopri come usare ob_end_flush() in PHP per inviare il buffer di output al browser e terminare il buffering dell'output con esempi pratici.

Quando PHP acquisisce l'output in un buffer anziché inviarlo direttamente al browser, alla fine è necessario rilasciare quel buffer. La funzione ob_end_flush() fa esattamente questo: invia il contenuto del buffer di output più in alto al livello successivo (il browser, o un buffer esterno) e poi elimina quel buffer. Questa pagina illustra cosa fa la funzione, quando utilizzarla, come si differenzia dalle funzioni correlate e le insidie più comuni.

Cosa fa la funzione ob_end_flush()

ob_end_flush() esegue due passaggi sul buffer di output attivo più interno (in cima allo stack):

  1. Svuota il buffer — il suo contenuto viene passato al buffer padre, oppure inviato al client se questo era l'ultimo buffer nello stack.
  2. Disattiva quel buffer, rimuovendolo dallo stack dei buffer.

Restituisce true in caso di successo, oppure false se non esiste alcun buffer attivo (ad esempio, se viene chiamata due volte, o se non è mai stato chiamato ob_start()). In caso di fallimento emette anche un E_NOTICE.

I buffer formano uno stack. Ogni ob_start() aggiunge un nuovo buffer in cima. ob_end_flush() agisce solo su quello attualmente in cima, non su tutti i buffer contemporaneamente. Controlla quanti sono aperti con ob_get_level().

Sintassi

ob_end_flush(): bool

La funzione non accetta argomenti e restituisce un valore booleano.

Esempio di base

<?php

ob_start();                       // start capturing output
echo "This will be buffered";     // goes into the buffer, not the screen yet
$ok = ob_end_flush();             // send the buffer out, then close it

var_dump($ok);                    // bool(true)

Output:

This will be bufferedbool(true)

ob_start() apre il buffer, l'echo ci finisce dentro, e ob_end_flush() rilascia il testo al browser e termina il buffering. Il var_dump() viene eseguito dopo che il buffer è stato chiuso, quindi il suo output viene inviato direttamente.

Quando usare questa funzione?

Il buffering dell'output è particolarmente utile quando è necessario decidere in ritardo cosa fare con l'output già generato:

  • Cattura, poi ispeziona o modifica — metti in buffer una sezione, leggila con ob_get_contents(), riscrivila se necessario, poi usa ob_end_flush() per inviare il risultato (eventualmente modificato).
  • Invia header dopo l'output — poiché nulla raggiunge il client mentre il buffering è attivo, puoi ancora chiamare header() o setcookie() anche dopo aver usato echo per il markup. ob_end_flush() rilascia tutto una volta che gli header sono stati definiti.
  • Template annidati — avvolgi un buffer interno, svuotalo in un buffer esterno che effettua ulteriori elaborazioni.

Se invece vuoi conservare il testo acquisito in una variabile anziché inviarlo, usa ob_get_clean(). Se vuoi scartare l'output, usa ob_end_clean().

ob_end_flush() a confronto con le funzioni correlate

FunzioneInvia il buffer?Mantiene il buffer aperto?Restituisce il contenuto?
ob_end_flush()No (lo chiude)No (restituisce bool)
ob_get_flush()No (lo chiude)Sì (restituisce la stringa)
ob_flush()Sì (rimane aperto)No
ob_end_clean()No (scarta)No (lo chiude)No

Un modo rapido per ricordarlo: flush invia, clean scarta, get_ restituisce anche la stringa, ed end_ chiude il buffer invece di lasciarlo aperto.

Svuotare buffer annidati

Poiché ob_end_flush() chiude solo un livello alla volta, è necessario chiamarla una volta per ogni buffer per svuotare completamente lo stack:

<?php

ob_start();                 // level 1
echo "outer ";

ob_start();                 // level 2
echo "inner";

echo ob_get_level();        // 2 — captured into level 2

ob_end_flush();             // level 2 flushes into level 1
ob_end_flush();             // level 1 flushes to the browser

Output:

outer inner2

L'echo interno e il conteggio dei livelli finiscono entrambi nel buffer 2; il primo ob_end_flush() li unisce nel buffer 1, e il secondo invia tutto al client.

Insidie comuni

  • Chiamarla senza un buffer attivo restituisce false e genera un notice. Proteggi il codice con if (ob_get_level() > 0) se non sei sicuro che un buffer sia aperto.
  • Non svuota tutto — una singola chiamata chiude un solo buffer. Usa un ciclo finché ob_get_level() non è 0 per svuotare ogni livello.
  • Non confonderla con flush(). La semplice flush() spinge i buffer di scrittura PHP/SAPI al client ma non tocca lo stack del buffering dell'output.

Conclusione

ob_end_flush() invia il buffer di output corrente al livello successivo e poi lo chiude. Usala quando hai utilizzato ob_start() per acquisire l'output e ora vuoi rilasciarlo. Ricorda che i buffer formano uno stack, che la funzione agisce solo su quello in cima, e che le varianti clean/get_ offrono le opzioni di scarto e restituzione che potresti preferire.

Pratica

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