Entendendo pra que serve ob_start(), ob_end_flush(), ob_get_contents() e afins

Fluxo de dados

Entendendo pra que serve ob_start(), ob_end_flush(), ob_get_contents() e afins

Atenção! Essa postagem foi escrita há mais de 2 anos. Na informática tudo evolui muito rápido e algumas informações podem estar desatualizadas. Embora o conteúdo possa continuar relevante, lembre-se de levar em conta a data de publicação enquanto estiver lendo. Caso tenha sugestões para atualizá-la, não deixe de comentar!

Prefácio

Se você mexe com PHP há um certo tempo, com certeza já deve ter visto em algum lugar estas funções e talvez tenha se perguntando para que elas servem.

A primeira vista pode parecer algo extremamente complexo e avançado, mas a resposta é mais simples do que se imagina.

Conceito

Em primeiro lugar, creio que é importante saber que OB significa Output Buffer. Isso, nada mais é do que o Buffer de saída. Buffer á uma região da memória onde os dados ficam armazenados temporariamente até que sejam despejados para a aplicação. Nesse caso, o buffer seria a saída pro navegador.

E qual a utilidade disso?

Você já deve ter se deparado com algum erro que dizia Headers already sent. Isso se dá porque já foi enviada alguma saída para o navegador. Cabeçalhos só podem ser enviados antes de qualquer saída html.

Um ob_start() irá pegar todos os dados de saída e guardar em buffer. Os dados só serão enviados ao navegador no momento em que você encerrar o buffer.

Existem três meios de encerrar o flush:

1. ob_end_flush(): Envia o conteúdo do buffer para a saída, esvazia-o e encerra o buffering;
2. ob_flush(): Envia o valor do buffer para o navegador e esvazia-o. Todas as entradas a seguir continuam indo para o buffer;
3. ob_end_clean(): Esvazia o buffer e encerra-o. Nenhuma saída é enviada.

Adicionalmente você pode utilizar a função ob_clean(), que apenas limpa o buffer.

Outra função que é muito importante é a ob_get_contents(), que irá retornar o conteúdo do buffer.

A seguir, veremos um exemplo simples de como guardar o retorno do phpinfo() dentro de um arquivo, utilizando o buffer para não enviar a saída para o navegador.

Mão na massa

Em primeiro lugar devemos iniciar o buffer. Depois iremos prosseguir como se fossemos executar o phpinfo() normalmente, porém a saída será guardada no buffer ao ivés de jogada na tela. Em seguida pegamos o resultado do buffer e gravamos em um arquivo HTML.

// Inicializa o buffer e bloqueia qualquer saída para o navegador
ob_start();

// Executamos o phpinfo() normalmente
phpinfo();

// Neste momento nenhuma saída foi enviada ao navegador

// Recebemos o valor do buffer na variável $resultado
$resultado = ob_get_contents();

// Já podemos encerrar o buffer e limpar tudo que há nele
ob_end_clean();

// Agora é só gravar um arquivo com os dados coletados
$ok = file_put_contents('phpinfo.html', $resultado);

// Envia uma mensagem para o usuário indicando se ocorreu tudo OK
if ($ok) {
    print 'Arquivo gravado com sucesso.<br>';
    print '<a href="phpinfo.html">Clique aqui para visualizar</a>';
} else {
    print 'Ocorreu um erro. Verifique as permissões.';
}

Conclusão

Trabalhar com buffer é ter milhões de possibilidades nas mãos. Você pode encontrar diversas utilidades para o seu uso. Eu gostaria muito que vocês comentasses sobre suas experiências utilizando estas técnicas.

Lembrando sempre: toda sugetão para novas colunas são sempre bem vindas!

Um abraço a todos e fiquem com Deus!
Rafael Jaques