W3docs

Funzione PHP ob_implicit_flush(): Tutto Quello che Devi Sapere

Scopri come usare ob_implicit_flush() in PHP per inviare l'output al client dopo ogni istruzione, con sintassi, parametri e casi d'uso pratici.

Per impostazione predefinita, PHP raccoglie tutto l'output del tuo script in un buffer interno e lo invia al client a blocchi. Il flush implicito cambia questo comportamento: dice a PHP di inviare l'output al client dopo ogni istruzione di output invece di attendere. La funzione ob_implicit_flush() è l'interruttore integrato che attiva o disattiva questo comportamento. Questo articolo ne illustra la sintassi, i parametri, il valore restituito, i casi d'uso reali e le insidie più comuni.

Cos'è la Funzione ob_implicit_flush()?

La funzione ob_implicit_flush() attiva o disattiva il flush implicito per il livello corrente del buffer di output. Quando è abilitato, PHP si comporta come se chiamasse ob_flush() automaticamente dopo ogni echo, print, printf o print_r — così l'output viene passato al livello successivo immediatamente invece di essere trattenuto.

Questo è particolarmente utile per gli script a lunga esecuzione in cui vuoi che l'utente veda il progresso mentre avviene — ad esempio un log di deployment, un'esportazione CSV o una barra di avanzamento — invece di guardare una pagina vuota finché lo script non termina.

Importante: il flush implicito influisce solo sul buffer di output di PHP. I server web come Apache, Nginx e PHP-FPM mantengono i propri buffer, e anche il browser ne ha uno. Per inviare effettivamente i byte all'utente di solito è necessaria una chiamata separata a flush() e, idealmente, nessun buffer ob_start() che trattiene i dati.

Sintassi

ob_implicit_flush(bool $enable = true): void

Parametri

ParametroTipoDescrizione
$enablebooltrue attiva il flush implicito, false lo disattiva. Il valore predefinito è true.

Valore restituito

In PHP 8.0 e versioni successive la funzione restituisce void. In PHP 7.x e versioni precedenti restituiva lo stato precedente del flush implicito come bool. A causa di questa modifica, non fare affidamento sul valore restituito nel codice che deve funzionare su più versioni.

Come Usare la Funzione ob_implicit_flush()

Lo schema comune è disabilitare il buffer regolare di PHP (o terminarlo), abilitare il flush implicito e chiamare flush() per superare il buffer del server:

<?php

// Turn off PHP's output buffering for this script so nothing is held back.
while (ob_get_level() > 0) {
    ob_end_flush();
}

ob_implicit_flush(true);

for ($i = 1; $i <= 3; $i++) {
    echo "Step {$i} done\n";
    flush();   // defeat the web server buffer
    sleep(1);  // simulate slow work
}

echo "All steps finished\n";

Ogni riga appare nel browser a circa un secondo di distanza l'una dall'altra invece che tutte insieme alla fine. ob_implicit_flush(true) elimina la necessità di chiamare ob_flush() dopo ogni echo, mentre flush() invia i dati oltre il buffer del server web.

Eseguendo da riga di comando i livelli di buffering sopra PHP non esistono, quindi l'output già scorre riga per riga — questo rende la CLI un buon posto per verificare la logica prima di eseguire il deploy dietro un server web.

Quando Dovresti Usarla?

  • Streaming dell'output di avanzamento — processi di importazione, elaborazione batch o qualsiasi situazione in cui una riga di stato per elemento mantiene la connessione attiva e l'utente informato.
  • Server-Sent Events (SSE) — invio di righe data: al browser in tempo reale.
  • Debug di problemi di buffering — abilitarla temporaneamente aiuta a vedere esattamente dove l'output si blocca.

In generale non è consigliabile usare il flush implicito per le pagine normali: inviare l'output in un unico blocco è più efficiente e consente a PHP di impostare gli header successivamente nello script.

Insidie Comuni

  • Da sola non è sufficiente. Il buffering a livello di server (e gzip/mod_deflate) può comunque trattenere l'output. Per la consegna in tempo reale potrebbe essere necessario disabilitare la compressione e chiamare flush().
  • Un buffer ob_start() attivo la sovrascrive. Se un buffer è aperto, l'output va lì per primo. Terminalo con ob_end_flush() o ob_end_clean() prima di fare affidamento sul flush implicito.
  • Non puoi inviare header dopo il flush. Una volta che qualsiasi output è stato inviato, le chiamate a header() falliranno con "headers already sent."

Funzioni Correlate

Conclusione

La funzione ob_implicit_flush() fornisce un semplice interruttore per far sì che PHP invii l'output immediatamente dopo ogni istruzione invece di bufferizzarlo. Combinata con flush() e la consapevolezza dei buffer lato server, permette di costruire indicatori di avanzamento e risposte in streaming per script a lunga esecuzione. Per le pagine normali, lasciala disattivata e lascia che PHP raggruppi l'output per te.

Esercizio

Pratica
Cosa fa ob_implicit_flush(1) in PHP?
Cosa fa ob_implicit_flush(1) in PHP?
Was this page helpful?