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
<?php // Inicializa o buffer e bloqueia qualquer saída para o navegador // Executamos o phpinfo() normalmente // Neste momento nenhuma saída foi enviada ao navegador // Recebemos o valor do buffer na variável $resultado // Já podemos encerrar o buffer e limpar tudo que há nele // 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) { } else { } ?>
<?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
PHP levado a sério