Função PHP ob_implicit_flush(): Tudo o Que Você Precisa Saber
Aprenda a usar a função PHP ob_implicit_flush() para ativar ou desativar o flushing implícito do buffer de saída, com exemplos práticos e dicas.
Por padrão, o PHP coleta tudo o que seu script gera em um buffer interno e envia ao cliente em blocos. O flushing implícito muda esse comportamento: ele instrui o PHP a enviar a saída ao cliente após cada instrução de saída, em vez de aguardar. A função ob_implicit_flush() é o interruptor integrado que liga ou desliga esse comportamento. Este artigo aborda sua sintaxe, parâmetros, valor de retorno, casos de uso práticos e os problemas comuns que costumam pegar os desenvolvedores de surpresa.
O Que É a Função ob_implicit_flush()?
A função ob_implicit_flush() alterna o flushing implícito para o nível atual do buffer de saída. Quando habilitado, o PHP se comporta como se você chamasse ob_flush() automaticamente após cada echo, print, printf ou print_r — de modo que a saída é entregue à próxima camada imediatamente, em vez de ser retida.
Isso é mais útil para scripts de longa duração em que você deseja que o usuário veja o progresso conforme ele acontece — por exemplo, um log de deploy, uma exportação CSV ou uma barra de progresso — em vez de encarar uma página em branco até que o script inteiro termine.
Importante: o flushing implícito afeta apenas o buffer de saída do próprio PHP. Servidores web como Apache, Nginx e PHP-FPM mantêm seus próprios buffers, assim como o navegador. Para realmente enviar bytes até o usuário, geralmente ainda é necessária uma chamada separada a
flush()e, idealmente, nenhum buffer deob_start()retendo os dados.
Sintaxe
ob_implicit_flush(bool $enable = true): voidParâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
$enable | bool | true ativa o flushing implícito, false o desativa. O padrão é true. |
Valor de retorno
No PHP 8.0 e versões posteriores, a função retorna void. No PHP 7.x e versões anteriores, ela retornava o estado anterior do flushing implícito como um bool. Por causa dessa mudança, não dependa do valor de retorno em código que deve funcionar entre versões.
Como Usar a Função ob_implicit_flush()
O padrão mais comum é desativar o buffer regular do PHP (ou encerrá-lo), habilitar o flushing implícito e chamar flush() para contornar o buffer do servidor:
<?php
// Turn off PHP's output buffering for this script so nothing is held back.
while (ob_get_level() > 0) {
ob_end_flush();
}
ob_implicit_flush(true);
for ($i = 1; $i <= 3; $i++) {
echo "Step {$i} done\n";
flush(); // defeat the web server buffer
sleep(1); // simulate slow work
}
echo "All steps finished\n";Cada linha aparece no navegador com aproximadamente um segundo de intervalo, em vez de aparecerem todas de uma vez no final. ob_implicit_flush(true) elimina a necessidade de chamar ob_flush() após cada echo, enquanto flush() envia os dados além do buffer do próprio servidor web.
Em uma execução via linha de comando, as camadas de buffering acima do PHP não existem, então a saída já é transmitida linha por linha — o que torna a CLI um bom lugar para confirmar sua lógica antes de implantar atrás de um servidor web.
Quando Usar?
- Transmissão de progresso — jobs de importação, processamento em lote ou qualquer situação em que uma linha de status por item mantém a conexão ativa e o usuário informado.
- Server-Sent Events (SSE) — envio de linhas
data:ao navegador em tempo real. - Depuração de problemas de buffering — habilitá-lo temporariamente ajuda a identificar exatamente onde a saída fica presa.
Em geral, você não deseja o flushing implícito para páginas normais: enviar a saída em um único bloco é mais eficiente e permite que o PHP defina cabeçalhos posteriormente no script.
Problemas Comuns
- Não é suficiente por si só. O buffering no nível do servidor (e
gzip/mod_deflate) ainda pode reter sua saída. Para entrega em tempo real, pode ser necessário desativar a compressão e chamarflush(). - Um buffer
ob_start()ativo sobrepõe o flushing implícito. Se um buffer estiver aberto, a saída vai para lá primeiro. Encerre-o comob_end_flush()ouob_end_clean()antes de depender do flushing implícito. - Não é possível enviar cabeçalhos após o flushing. Uma vez que qualquer saída for enviada, as chamadas a
header()falharão com "headers already sent."
Funções Relacionadas
ob_start()— inicia um novo buffer de saída.ob_flush()— faz o flush do buffer atual manualmente.flush()— faz o flush dos buffers de escrita do sistema abaixo do PHP.- Visão geral do Controle de Saída PHP — toda a família
ob_*em um só lugar.
Conclusão
A função ob_implicit_flush() fornece um interruptor simples para fazer o PHP enviar a saída imediatamente após cada instrução, em vez de armazená-la em buffer. Combinada com flush() e um entendimento dos buffers do lado do servidor, ela permite criar indicadores de progresso e respostas em streaming para scripts de longa duração. Para páginas comuns, deixe-a desativada e deixe o PHP agrupar a saída por você.