PHPit - PHP

"Agora, pois, permanecem a fé, a esperança, o amor, estes três; mas o maior destes é o amor." (I Coríntios 13:13)

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

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, 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.

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.

Código: Alternar entre o modo de cópia/destaque
  1. <?php
  2.  
  3. // Inicializa o buffer e bloqueia qualquer saída para o navegador
  4.  
  5. // Executamos o phpinfo() normalmente
  6.  
  7. // Neste momento nenhuma saída foi enviada ao navegador
  8.  
  9. // Recebemos o valor do buffer na variável $resultado
  10. $resultado = ob_get_contents();
  11.  
  12. // Já podemos encerrar o buffer e limpar tudo que há nele
  13.  
  14. // Agora é só gravar um arquivo com os dados coletados
  15. $ok = file_put_contents('phpinfo.html', $resultado);
  16.  
  17. // Envia uma mensagem para o usuário indicando se ocorreu tudo OK
  18. if ($ok) {
  19. print 'Arquivo gravado com sucesso.';
  20. print '<a href="phpinfo.html">Clique aqui para visualizar</a>';
  21. } else {
  22. print 'Ocorreu um erro. Verifique o permissionamento.';
  23. }
  24.  
  25. ?>
<?php

    
// 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 
'<a href="phpinfo.html">Clique aqui para visualizar</a>';
    } else {
        print 
'Ocorreu um erro. Verifique o permissionamento.';
    }
    
?>


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

Dim dim

 

Comentaí! (08)

Legal, não conhecia essas funções.
Bom saber que elas existem, e que podem ser úteis :D

Valeu por explicar ;)
Abraço. faael em 03/02/2009 às 22:49 utilizando o Mozilla Firefox Mozilla Firefox 3.0.5 no Windows Windows Vista
Rafael, trabalhar com as funções de buffer não seria a mesa coisa que trabalhar com $_session????

Alguns dia atrás tive um problema, pois para algumas paginas do meu site vinha um erro antes do start_session();, depois de pesquisar muito, descobri que a codificação do meu documento php não tinha o formato padrão, as funções decritas acima resolveriam o meu problema?? SQUIK em 05/02/2009 às 10:53 utilizando o Mozilla Firefox Mozilla Firefox 3.0.5 no Windows Windows Vista
Cara, esse OB_start me deu uma baile tempos atrás. Desenvolvi um sistema que rodava perfeitamente localmente em qualquer navegador, e online rodav apenas no firefox, sendo que problema diagnosticado foi que o Internet Explorer(qualquer versão) não estava conseguindo resgatar os dados gravados na sessão, parecia q simplesmente a sessão morria. A solução foi bufferizar todo conteúdo logo após iniciar a sessão, e mandar um cabelho from hell pro IE manter o buffer em cache, segue o famigerado código de iníco das páginas do sistema:

<?php
header('P3P: CP="CAO PSA OUR"');
ob_start();
//Resto do sistema
?>

Certas coisas somente a microsoft entende mesmo... Anderson Triacca em 06/02/2009 às 20:56 utilizando o Mozilla Firefox Mozilla Firefox 3.0.6 no Windows Windows Vista
Faltou o principal, se algúem por aew pegar um problema do IE não consguir gravar nem ler na sessão, coloca akele código logo após iniciar a sessão que não tem erro, problema resolvido! Anderson Triacca em 06/02/2009 às 20:57 utilizando o Mozilla Firefox Mozilla Firefox 3.0.6 no Windows Windows Vista
Uma outra utilizadade destas funções é na criação de templates, onde vc teria um arquivo com o conteudo e algum padrão que seria substituido por um conteudo dinamico. Humberto em 12/02/2009 às 16:22 utilizando o Mozilla Firefox Mozilla Firefox 3.0.6 no Windows Windows XP
Squik..

Na verdade uma coisa não tem a ver com a outra...

A session vai trabalhar com as variáveis de sessão da tua aplicação..

E estas funções trabalham com o buffer.. O buffer é apenas a saída pro navegador..

É claro que, usando buffer, você pode neutralizar alguns bugs de sessão, quando você envia saidas indesejadas ao navegador..

Mas não sei se vai resolver o seu problema..


Abraço! Rafael Jaques em 12/02/2009 às 16:42 utilizando o Mozilla Firefox Mozilla Firefox 3.0.6 no Mac OS Mac OS X
Gostei do Post. Muito informativo. Continuem por favor, mal posso esperar pelo próximo. Vinícius em 08/10/2009 às 14:39 utilizando o Mozilla Firefox Mozilla Firefox 3.5.3 no Windows Windows XP
Te amo cara! kkk

Me ajudou muito isso, achei meio sem quere este post mas foi de grande ajuda, valeu! :D Denis Lins em 07/06/2010 às 10:00 utilizando o Mozilla Firefox Mozilla Firefox 3.6.3 no Windows Windows NT
 

Comenta logo, pô!

* Todos os links inseridos nos comentários possuem rel="nofollow" para impedir com que crawlers considerem os mesmos como relevantes.
* Os e-mails não são divulgados.

Dados pessoais

Você é realmente um humano?

Finalmente, digite seu comentário :)

Caixinha de Sugestões

O que é isso? Aqui você pode simplesmente digitar uma sugestão (artigos, resenhas, melhorias, etc) sem precisar preencher longos formulários. Digite o que quiser na caixinha abaixo e eu lerei com o maior prazer! Se quiser se identificar, fique a vontade!

O PHPit é redigido e mantido por Rafael Jaques - Política de Privacidade.

XHTML/CSS desenvolvido por André Gazola.

PHPit 2007 - 2009 - Alguns direitos reservados.

Feeds ;)

Creative Commons License

PHPit por Rafael Jaques é licensiado sob a Creative Commons Atribuição-Uso Não-Comercial-Compartilhamento pela mesma Licença 2.5 Brasil License.