Funzione PHP ob_get_level(): Tutto Quello che Devi Sapere
Scopri come usare ob_get_level() in PHP per ottenere il livello corrente dell'output buffering e gestire stack di buffer annidati.
ob_get_level() restituisce quanti buffer di output sono attualmente attivi, ovvero quanto è annidata la gestione dell'output buffering. I buffer di output in PHP formano uno stack: ogni chiamata a ob_start() aggiunge un nuovo buffer allo stack, e ogni chiamata ob_end_* ne rimuove uno. ob_get_level() indica l'altezza corrente di questo stack.
Questo è il modo più sicuro per verificare "l'output buffering è attivo?" e "quanti livelli ci sono?" senza toccare il contenuto nel buffer. Questa pagina illustra la firma della funzione, il valore restituito, il funzionamento dell'annidamento e i casi d'uso più comuni.
Sintassi
ob_get_level(): intLa funzione non accetta argomenti e restituisce un int:
0— nessun output buffering attivo.1— esattamente un buffer è aperto.2,3, … — tanti buffer sono annidati uno sopra l'altro.
Non genera mai eccezioni né produce output proprio, quindi è sicura da chiamare in qualsiasi punto.
Un esempio di base
Quando non è stato avviato alcun buffer, il livello è 0. Dopo un ob_start() diventa 1:
<?php
echo ob_get_level(); // 0 — nothing buffered yet
ob_start();
echo ob_get_level(); // 1 — one buffer is now active
ob_end_clean();
echo ob_get_level(); // 0 — buffer popped, back to baselineNota che le due chiamate echo all'interno del buffer vengono catturate dal buffer stesso; ob_end_clean() scarta il testo catturato, quindi l'unica cosa che raggiunge il browser è il finale 0. Per vedere i valori intermedi durante lo sviluppo, salvali prima in variabili oppure usa ob_get_clean() per rilasciare il buffer.
Contare i buffer annidati
Poiché i buffer formano uno stack, chiamare ob_start() due volte fornisce un livello pari a 2. È questo comportamento che rende ob_get_level() davvero utile:
<?php
ob_start(); // level 1
ob_start(); // level 2
$level = ob_get_level(); // 2
ob_end_clean(); // level 1
ob_end_clean(); // level 0
echo "Deepest nesting was: {$level}"; // Deepest nesting was: 2Framework, motori di template e handler di shutdown aprono spesso i propri buffer, quindi su una richiesta reale il livello potrebbe essere già 1 o più prima che il tuo codice venga eseguito.
Quando utilizzarla?
-
Pulizia difensiva. Prima di inviare intestazioni o avviare un nuovo buffer, svuota ciò che è aperto in modo da evitare che output residui compromettano la risposta:
<?php // Discard any buffers a framework or earlier code left open while (ob_get_level() > 0) { ob_end_clean(); } -
Flush condizionale. Esegui il flush solo se un buffer è effettivamente attivo, evitando un avviso da
ob_end_flush()quando non ne esiste nessuno:<?php if (ob_get_level() > 0) { ob_end_flush(); } -
Debug dei buffer leak. Registrare
ob_get_level()all'inizio e alla fine di una richiesta aiuta a individuare un buffer aperto ma mai chiuso.
Attenzioni
ob_get_level()non legge né svuota il buffer — per questo usaob_get_contents()oppureob_get_clean().- Chiamare
ob_end_clean()/ob_end_flush()quando il livello è0genera un avviso. Proteggi tali chiamate con un controlloob_get_level() > 0, come mostrato sopra. - Un'impostazione elevata di
zlib.output_compressiono un framework configurato possono far sì che il livello sia diverso da zero già dalla prima riga dello script — non dare mai per scontato che parta da0.
Conclusione
ob_get_level() riporta la profondità corrente dello stack di buffer di output di PHP: 0 quando il buffering è disattivo, e un numero maggiore per ogni ob_start() annidato. Poiché ispeziona lo stack senza consumare il contenuto bufferizzato, è lo strumento giusto per proteggere le operazioni sui buffer e per svuotare correttamente tutti i buffer aperti prima di inviare la risposta finale.