Função ob_get_length() do PHP: Tudo o que Você Precisa Saber
Aprenda como usar a função ob_get_length() do PHP para obter o comprimento do buffer de saída ativo, com exemplos práticos e dicas de uso.
ob_get_length() retorna o número de bytes atualmente armazenados no buffer de saída ativo do PHP — o conteúdo que foi capturado por ob_start() mas ainda não enviado ao navegador. É útil quando você deseja medir a saída gerada antes de decidir o que fazer com ela: impor um limite de tamanho, construir um cabeçalho Content-Length, registrar o tamanho de um payload, ou simplesmente verificar se algo já foi escrito.
Esta página cobre a assinatura da função, seu valor de retorno, as armadilhas com buffers aninhados e alguns padrões práticos.
Sintaxe
ob_get_length(): int|falseA função não recebe nenhum argumento. Ela retorna:
- um inteiro — o comprimento em bytes dos dados no buffer de saída ativo, ou
false— se o buffer de saída não estiver ativo (nenhum buffer foi iniciado, ou todos já foram fechados).
Como pode retornar false, sempre compare com === em vez de uma verificação solta se você precisar distinguir "sem buffer" de um buffer de comprimento 0.
Um exemplo básico
<?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: 21Aqui ob_start() inicia o buffer, de modo que echo escreve no buffer em vez de ir para o navegador. ob_get_length() retorna 21 (o comprimento em bytes da string). ob_end_clean() descarta o conteúdo do buffer — apenas o echo final chega à saída.
Note que o comprimento é medido em bytes, não em caracteres. Uma string UTF-8 multibyte reportará mais bytes do que tem caracteres visíveis.
Detectando se um buffer está ativo
Quando nenhum buffer está em efeito, a função retorna false:
<?php
var_dump(ob_get_length()); // bool(false)
ob_start();
echo "hi";
var_dump(ob_get_length()); // int(2)
ob_end_clean();Isso torna ob_get_length() uma forma rápida de testar "há algo sendo bufferizado atualmente?" — intimamente relacionado a ob_get_level(), que informa quantos buffers aninhados estão abertos.
Buffers aninhados: apenas o ativo é medido
Os buffers do PHP podem ser empilhados. ob_get_length() sempre reporta o comprimento do buffer mais externo (mais interno, atualmente ativo) — nunca o total combinado:
<?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 você precisar do quadro completo, inspecione cada nível com ob_get_level() e remova os buffers um a um.
Um padrão prático: ignorar saída vazia
Um uso comum é evitar emitir qualquer coisa (e a sobrecarga de trabalho relacionado) quando um fragmento bufferizado acabou vazio:
<?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();
}Para ler os bytes bufferizados em vez de apenas seu comprimento, use ob_get_contents(); para capturar o conteúdo e fechar o buffer em uma única chamada, use ob_get_clean().
Conclusão
ob_get_length() reporta o comprimento em bytes do buffer de saída ativo do PHP, ou false quando nenhum buffer está aberto. Lembre-se de três coisas: conta bytes, mede apenas o buffer ativo em uma pilha aninhada, e um retorno false significa que o buffer está desativado. Combinada com o restante das funções de controle de saída — ob_get_contents(), ob_get_clean() e ob_get_level() — ela permite medir e gerenciar a saída gerada com precisão antes que chegue ao navegador.