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.
Em primeiro lugar, você precisa saber o que significa esta sigla: OB. Deixando de lado o fato de que muita gente pensou besteira, OB significa Output Buffer, que 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.
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.';
print 'Clique aqui para visualizar';
} else {
print 'Ocorreu um erro. Verifique o permissionamento.';
}
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
Muito legal a matéria,sempre me debatia quando ia iniciar uma sessão porém aparecia o ‘Headers already sent’.
Ola!, achei ótima esta explicação Rafaeljaques estou aprendendo php e estou com um livro que mostra como colocar abas no site e usa o ob_start() porem não é muito explicativo para iniciantes então fiquei sem entender este comando mas agora com a sua explicação entendi melhor o código, obrigado e até mais.
Parabens!!!!
Objetivo e muito claro, muito obrigado, me ajudou bastante.
Ótmia matéria.
Ainda não conhecia as funções de outuput buffer mas hoje tive a necessidade de usar. Irei utiliza-la em uma classe chamada por um robo, a classe retorna algumas mensagens em caso de erro.
Como este arquivo é chamado automaticamente irei utilizar as funções de output buffer para não exibir nada.
O ob… pode ser utilizado para validar login ?
Uma vez que o usuário saiu limpar o buffer e o id da session ser apagado ?
Tutorial está ótimo ! Parabéns .
Melhor impossível !
Um abraço, e obrigado pelo tutorial !
Primeiramente quero agradecer pela matéria!
Segundo… tirar uma dúvida!
Existe um arquivo em minha aplicação, responsável por inserção de dados no meu banco de dados(MySql). Só que o danado ta mostrando-me o famoso “Headers already sent”… Então resolvi por no começo do script:
Payment.php:
Com isso o problema do ‘Headers’ foi resolvido… Porem! algo inusitado me ocorreu, o script está INSERINDO o DOBRO do que realmente é para inserir..
No caso, se ele deve inserir um registro ele acaba inserindo 2x o mesmo registro na tabela.
OBS: SEM o ob_start()( e lógico sem o ‘header(Location: ..)’) o registro é inserido normalmente, mas com o OB ele duplica!
Alguém já passou por isso..? Sim? Me ajuda então! rsrs..
[]‘s
Muito bom o tópico.
Estou usando estas funções pra jogar o conteúdo html e css, para dentro do mPDF, para a geração de relatórios.
Valeu pela informação.
Parabéns pelo post! Ajudou a esclarecer muitos problemas. Muito obrigado!
Parabéns, simples e direto. Segui suas recomendações e resolvi problemas com o aplicativo fpdf.php’ gerador de pdf.
Sucesso, ……….
Muito legal
. Ajudou d+ aqui.
.
Deus abençoe vc sempre mais viu e continue nos ajudando
Vlw mesmo.
Ajudou bastante a matéria!