W3docs

Funzione PHP ob_start(): Tutto Quello che Devi Sapere

Scopri come usare ob_start() in PHP per il buffering dell'output, catturare contenuti, trasformarli con callback e gestire gli header HTTP.

Quando PHP esegue uno script, ogni echo, print o blocco HTML viene normalmente inviato al client immediatamente. Il buffering dell'output cambia questo comportamento: trattiene tutto ciò che lo script stamperebbe in un buffer in memoria, così puoi catturarlo, modificarlo o scartarlo prima che lasci il server. La funzione ob_start() è la funzione integrata che attiva questo buffering.

Questo capitolo spiega cosa fa ob_start(), i suoi parametri, come catturare e trasformare l'output, i casi d'uso più comuni nel mondo reale e le insidie che mettono in difficoltà gli sviluppatori.

Cos'è la Funzione ob_start()?

ob_start() attiva il buffering dell'output. Mentre il buffering è attivo, nulla di ciò che lo script stampa viene inviato al browser. Invece si accumula in un buffer interno finché non lo invii esplicitamente (flush), lo ottieni come stringa o lo pulisci.

L'unica cosa che il buffering non trattiene sono gli header HTTP. Poiché il corpo non viene più inviato subito, puoi ancora chiamare funzioni come header() dopo aver già prodotto dell'output — il che è il motivo più comune per cui gli sviluppatori ricorrono a ob_start().

I buffer si annidano anche: ogni chiamata a ob_start() aggiunge un nuovo buffer su uno stack, e la corrispondente funzione di chiusura/flush estrae quello in cima. Puoi verificare quanto è profondo lo stack con ob_get_level().

Sintassi

ob_start(
    ?callable $callback = null,
    int $chunk_size = 0,
    int $flags = PHP_OUTPUT_HANDLER_STDFLAGS
): bool

Parametri:

  • $callback — Opzionale. Una funzione che riceve il contenuto del buffer (e una maschera di bit di stato) e restituisce la stringa da inviare effettivamente. Usala per trasformare tutto ciò che lo script stampa — ad esempio, minimizzando l'HTML o comprimendolo con gzip.
  • $chunk_size — Opzionale. Se maggiore di 0, il callback viene invocato ogni volta che il buffer raggiunge questo numero di byte, invece che solo quando viene svuotato. 0 (il valore predefinito) significa svuotare solo al completamento.
  • $flags — Opzionale. Una maschera di bit che controlla se il buffer può essere pulito, svuotato e rimosso. Il valore predefinito PHP_OUTPUT_HANDLER_STDFLAGS consente tutte e tre le operazioni.

Valore restituito: true in caso di successo, false in caso di errore.

Utilizzo di Base: Catturare l'Output

Il pattern più comune è avviare un buffer, stampare qualcosa, quindi catturarlo in una variabile con ob_get_clean() (che restituisce il buffer e disattiva il buffering in un solo passaggio):

<?php

ob_start();                 // start buffering — nothing is sent yet
echo "Hello, ";
echo "world!";
$output = ob_get_clean();   // grab the buffer as a string, stop buffering

echo strtoupper($output);   // now we control what actually gets sent

Output:

HELLO, WORLD!

In questo caso, le due chiamate echo non raggiungono mai direttamente il client. ob_get_clean() restituisce "Hello, world!", e solo la versione in maiuscolo viene infine stampata. Questo flusso "cattura, poi trasforma" è ciò che rende il buffering potente.

Trasformare l'Output con un Callback

Invece di catturare manualmente, puoi passare un callback a ob_start(). PHP lo esegue sul buffer automaticamente quando viene svuotato (qui, alla fine dello script):

<?php

function addBang(string $buffer): string
{
    return str_replace("world", "World!", $buffer);
}

ob_start("addBang");
echo "hello world";
// buffer is flushed automatically at script end → callback runs

Output:

hello World!

Questo è esattamente il modo in cui funzionano i gestori integrati come ob_gzhandler() — passalo come callback e l'intera pagina viene compressa con gzip in modo trasparente.

Casi d'Uso Comuni

  • Inviare header dopo l'output. Poiché il corpo è bufferizzato, puoi ancora chiamare header() o setcookie() dopo aver prodotto HTML, evitando il temuto avviso "headers already sent". Vedi headers_sent().
  • Templating. Cattura l'HTML renderizzato di un file template in una stringa invece di stamparlo direttamente, così può essere restituito, memorizzato nella cache o avvolto in un layout.
  • Post-elaborazione dell'intera pagina. Minimizza l'HTML, riscrivi gli URL o rimuovi i commenti tramite un callback prima che venga inviato qualsiasi contenuto.
  • Compressione. Usa ob_gzhandler per comprimere le risposte senza modificare le chiamate echo del tuo script.

Funzioni Correlate

Raramente utilizzerai ob_start() da solo. Queste funzioni gestiscono il buffer che crea:

  • ob_get_contents() — Restituisce il contenuto del buffer senza svuotarlo.
  • ob_get_clean() — Restituisce il buffer e disattiva il buffering.
  • ob_clean() — Scarta il contenuto del buffer ma mantiene il buffering attivo.
  • ob_end_flush() — Invia il buffer al client e disattiva il buffering.
  • ob_end_clean() — Scarta il buffer e disattiva il buffering (non invia nulla).
  • ob_get_level() — Restituisce quanti buffer annidati sono attualmente attivi.

Per una panoramica più ampia, vedi PHP Output Control.

Insidie Comuni

  • Chiudi sempre ciò che apri. Ogni ob_start() deve essere abbinata a una chiamata di flush/clean. Un buffer non chiuso viene svuotato automaticamente alla fine dello script, ma lasciarli aperti in script lunghi può nascondere output o sprecare memoria.
  • ob_get_clean() restituisce false se nessun buffer è attivo. Chiamarla senza un ob_start() corrispondente restituisce false, non una stringa vuota.
  • Il buffering ≠ header infiniti. Gli header non vengono bufferizzati; solo il corpo lo è. Una volta che un buffer viene svuotato verso il client, gli header sono bloccati.

Conclusione

ob_start() attiva il buffering dell'output in modo che PHP trattenga l'output dello script in memoria invece di inviarlo immediatamente. Ciò ti permette di catturare l'output in una stringa, trasformarlo con un callback, inviare header dopo la stampa o comprimere un'intera pagina. Abbinala a ob_get_clean() per catturare, ob_end_flush() per inviare e ob_end_clean() per scartare — e ricorda di chiudere sempre ogni buffer che apri.

Practice

Pratica
Cosa fa la funzione 'ob_start()' in PHP?
Cosa fa la funzione 'ob_start()' in PHP?
Was this page helpful?