Funzione PHP ob_get_contents(): tutto quello che devi sapere
Scopri come usare ob_get_contents() in PHP per leggere il contenuto del buffer di output senza svuotarlo, con esempi pratici e casi d'uso.
Normalmente, quando uno script esegue echo o print, PHP invia il contenuto direttamente al browser. Il buffering dell'output consente di intercettare quell'output e tenerlo in memoria, in modo da poterlo catturare, modificare o scartare prima che raggiunga il client. La funzione ob_get_contents() è lo strumento che permette di leggere ciò che si trova attualmente in quel buffer.
Questo capitolo spiega cosa restituisce ob_get_contents(), quando usarla, le insidie a cui prestare attenzione e come si inserisce accanto alle altre funzioni di controllo dell'output.
Cosa fa ob_get_contents()
ob_get_contents() restituisce il contenuto del buffer di output attivo senza svuotarlo né interrompere il buffering. Il buffer continua a raccogliere output, quindi è possibile chiamare la funzione più volte per vedere cosa è stato accumulato finora.
Funziona solo mentre è attivo un buffer avviato da ob_start(). Se non è presente alcun buffer attivo, restituisce false.
Sintassi
ob_get_contents(): string|false- Parametri: nessuno.
- Valore restituito: il contenuto attuale del buffer come stringa, oppure
falsese il buffering dell'output non è attivo.
Un esempio di base
<?php
ob_start(); // 1. Start capturing output
echo "This will be buffered"; // 2. Goes into the buffer, not the screen
$output = ob_get_contents(); // 3. Read the buffer into a variable
ob_end_clean(); // 4. Discard the buffer and stop buffering
echo "Captured: " . $output;Questo stampa:
Captured: This will be bufferedQui ob_start() avvia il buffering, quindi l'echo viene tenuto in memoria anziché inviato al browser. ob_get_contents() copia quel testo in $output. Infine ob_end_clean() elimina il buffer e disattiva il buffering — senza di esso, il testo bufferizzato verrebbe comunque inviato alla pagina.
ob_get_contents() non svuota il buffer
Un punto di confusione comune: la lettura del buffer lo lascia intatto. L'output è ancora lì e verrà inviato al browser al termine del buffering (a meno che non venga pulito).
<?php
ob_start();
echo "Hello";
$first = ob_get_contents(); // "Hello"
echo " World";
$second = ob_get_contents(); // "Hello World" — the buffer kept growing
ob_end_flush(); // sends "Hello World" to the browser
var_dump($first, $second);Questo produce:
Hello World
string(5) "Hello"
string(11) "Hello World"Se invece vuoi leggere e cancellare il buffer in un solo passaggio, usa ob_get_clean().
Quando usarla?
- Catturare l'output renderizzato. Renderizza un template o includi un file, quindi ottieni il risultato come stringa invece di stamparlo — utile per email, caching o generazione di file.
- Post-elaborazione dell'HTML. Bufferizza una pagina, leggila con
ob_get_contents(), applica una trasformazione (minificazione, sostituzione di segnaposto), poi restituisci il risultato. - Sopprimere o ispezionare l'output di una funzione o libreria che stampa direttamente.
<?php
function renderGreeting(string $name): void
{
echo "<p>Hello, {$name}!</p>";
}
ob_start();
renderGreeting("Ada");
$html = ob_get_contents(); // capture instead of printing
ob_end_clean();
$html = str_replace("Hello", "Welcome", $html);
echo $html;Questo produce:
<p>Welcome, Ada!</p>Insidie
- Restituisce
false, non una stringa vuota, quando non è attivo alcun buffer. Usa un controllo rigoroso (=== false) se devi distinguere "nessun buffer" da "buffer vuoto". - Buffer annidati:
ob_get_contents()legge solo il livello di buffer più interno (corrente). Per vedere quanti buffer sono impilati, usaob_get_level(). - Non interrompe il buffering. Abbinala a
ob_end_clean()oob_end_flush()quando hai finito.
Funzioni correlate
ob_start()— attiva il buffering dell'output.ob_get_clean()— ottiene il contenuto del buffer e lo elimina.ob_get_length()— ottiene la lunghezza del buffer in byte.- Panoramica del controllo dell'output PHP — la famiglia completa delle funzioni
ob_*.
Conclusione
ob_get_contents() legge il buffer di output corrente come stringa senza svuotarlo né terminare il buffering. È il blocco fondamentale per catturare l'output renderizzato, post-elaborare l'HTML e sopprimere l'output diretto. Ricorda che restituisce false quando non è attivo alcun buffer, e che lascia il buffer intatto — usa ob_get_clean() quando vuoi leggere e svuotare in un'unica operazione.