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):
- Svuota il buffer — il suo contenuto viene passato al buffer padre, oppure inviato al client se questo era l'ultimo buffer nello stack.
- 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 conob_get_level().
Sintassi
ob_end_flush(): boolLa 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 usaob_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()osetcookie()anche dopo aver usatoechoper 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
| Funzione | Invia il buffer? | Mantiene il buffer aperto? | Restituisce il contenuto? |
|---|---|---|---|
ob_end_flush() | Sì | No (lo chiude) | No (restituisce bool) |
ob_get_flush() | Sì | No (lo chiude) | Sì (restituisce la stringa) |
ob_flush() | Sì | 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 browserOutput:
outer inner2L'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
falsee genera un notice. Proteggi il codice conif (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 è0per svuotare ogni livello. - Non confonderla con
flush(). La sempliceflush()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.