W3docs

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(): int

La 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 baseline

Nota 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: 2

Framework, 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 usa ob_get_contents() oppure ob_get_clean().
  • Chiamare ob_end_clean() / ob_end_flush() quando il livello è 0 genera un avviso. Proteggi tali chiamate con un controllo ob_get_level() > 0, come mostrato sopra.
  • Un'impostazione elevata di zlib.output_compression o 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 da 0.

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.

Esercitazione

Pratica
Cosa fa la funzione PHP ob_get_level()?
Cosa fa la funzione PHP ob_get_level()?
Was this page helpful?