Funzione PHP ob_get_length(): tutto quello che devi sapere
Scopri come usare ob_get_length() in PHP per ottenere la lunghezza in byte del buffer di output attivo, con esempi pratici e casi d'uso comuni.
ob_get_length() restituisce il numero di byte attualmente presenti nel buffer di output attivo di PHP — il contenuto catturato da ob_start() ma non ancora inviato al browser. È utile quando si vuole misurare l'output generato prima di decidere cosa farne: imporre un limite di dimensione, costruire un'intestazione Content-Length, registrare la dimensione di un payload, o semplicemente verificare se è stato scritto qualcosa.
Questa pagina tratta la firma della funzione, il suo valore di ritorno, le insidie legate ai buffer annidati e alcuni schemi pratici.
Sintassi
ob_get_length(): int|falseLa funzione non accetta argomenti. Restituisce:
- un intero — la lunghezza in byte dei dati nel buffer di output attivo, oppure
false— se il buffering dell'output non è attivo (nessun buffer è stato avviato, o tutti sono già stati chiusi).
Poiché può restituire false, confronta sempre con === anziché un controllo generico se hai bisogno di distinguere "nessun buffer" da un buffer di lunghezza 0.
Un esempio di base
<?php
ob_start();
echo "This will be buffered"; // 21 bytes
$length = ob_get_length();
ob_end_clean(); // discard the buffer
echo "Buffered length was: $length"; // Buffered length was: 21Qui ob_start() avvia il buffering, quindi echo scrive nel buffer invece di inviare al browser. ob_get_length() riporta 21 (la lunghezza in byte della stringa). ob_end_clean() poi scarta il contenuto del buffer — solo l'echo finale raggiunge l'output.
Nota che la lunghezza è misurata in byte, non in caratteri. Una stringa UTF-8 multibyte riporterà più byte rispetto ai caratteri visibili.
Rilevare se un buffer è attivo
Quando non è attivo alcun buffering, la funzione restituisce false:
<?php
var_dump(ob_get_length()); // bool(false)
ob_start();
echo "hi";
var_dump(ob_get_length()); // int(2)
ob_end_clean();Questo rende ob_get_length() un modo rapido per verificare "c'è qualcosa attualmente in buffering?" — strettamente correlato a ob_get_level(), che indica quanti buffer annidati sono aperti.
Buffer annidati: viene misurato solo quello attivo
I buffer PHP possono essere impilati. ob_get_length() riporta sempre la lunghezza del buffer più esterno (interno, attualmente attivo) — mai il totale combinato:
<?php
ob_start();
echo "outer"; // 5 bytes in the outer buffer
ob_start();
echo "inner text"; // 10 bytes in the inner buffer
$inner = ob_get_length(); // measures the active (inner) buffer
ob_end_clean(); // discard inner
$outer = ob_get_length(); // outer is active again
ob_end_clean(); // discard outer
echo "inner=$inner outer=$outer"; // inner=10 outer=5Se hai bisogno del quadro completo, esamina ogni livello con ob_get_level() e rimuovi i buffer uno alla volta.
Uno schema pratico: saltare l'output vuoto
Un uso comune è evitare di emettere qualsiasi cosa (e il costo del lavoro correlato) quando un frammento bufferizzato risulta vuoto:
<?php
ob_start();
// ... template / partial that may or may not produce output ...
if (ob_get_length() > 0) {
// there is real content — send it
ob_end_flush();
} else {
// nothing was generated — drop the empty buffer
ob_end_clean();
}Per leggere i byte bufferizzati stessi invece della sola loro lunghezza, usa ob_get_contents(); per ottenere il contenuto e chiudere il buffer in una sola chiamata, usa ob_get_clean().
Conclusione
ob_get_length() riporta la lunghezza in byte del buffer di output attivo di PHP, o false quando nessun buffer è aperto. Ricorda tre cose: conta i byte, misura solo il buffer attivo in uno stack annidato, e un ritorno false significa che il buffering è disattivato. Combinata con il resto delle funzioni di controllo dell'output — ob_get_contents(), ob_get_clean() e ob_get_level() — ti permette di misurare e gestire con precisione l'output generato prima che raggiunga il browser.