W3docs

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 de ob_start() retendo os dados.

Sintaxe

ob_implicit_flush(bool $enable = true): void

Parâmetros

ParâmetroTipoDescrição
$enablebooltrue 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 chamar flush().
  • 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 com ob_end_flush() ou ob_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

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

Prática

Prática
O que ob_implicit_flush(1) faz no PHP?
O que ob_implicit_flush(1) faz no PHP?
Was this page helpful?