Postado em 3 de fevereiro de 2009
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