Nota para usuários mod_fcgid (por favor, use por sua própria conta e risco).
Solução Rápida
A resposta aceita de Joeri Sebrechts é de fato funcional. No entanto, se você usar o mod_fcgid, poderá descobrir que esta solução não funciona sozinha. Em outras palavras, quando a função flush é chamada, a conexão com o cliente não é fechada.
O FcgidOutputBufferSize
parâmetro de configuração de mod_fcgid pode ser o culpado. Encontrei esta dica em:
- esta resposta de Travers Carter e
- esta postagem do blog de Seumas Mackinnon .
Depois de ler o acima, você pode chegar à conclusão de que uma solução rápida seria adicionar a linha (consulte "Exemplo de Host Virtual" no final):
FcgidOutputBufferSize 0
em seu arquivo de configuração do Apache (por exemplo, httpd.conf), seu arquivo de configuração FCGI (por exemplo, fcgid.conf) ou em seu arquivo de hosts virtuais (por exemplo, httpd-vhosts.conf).
Em (1) acima, uma variável chamada "OutputBufferSize" é mencionada. Este é o nome antigo do FcgidOutputBufferSize
mencionado em (2) (veja as notas de atualização na página da web do Apache para mod_fcgid ).
Detalhes e uma segunda solução
A solução acima desativa o buffering executado por mod_fcgid para todo o servidor ou para um host virtual específico. Isso pode levar a uma penalidade de desempenho para o seu site. Por outro lado, pode muito bem não ser o caso, já que o PHP realiza o buffer por conta própria.
Caso você não queira desabilitar o buffer de mod_fcgid , há outra solução ... você pode forçar o esvaziamento deste buffer .
O código abaixo faz exatamente isso com base na solução proposta por Joeri Sebrechts:
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // just to be safe
ob_start();
echo('Text the user will see');
echo(str_repeat(' ', 65537)); // [+] Line added: Fill up mod_fcgi's buffer.
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Do processing here
sleep(30);
echo('Text user will never see');
?>
O que a linha de código adicionada essencialmente faz é preencher o buffer de mod_fcgi , forçando-o a esvaziar. O número "65537" foi escolhido porque o valor padrão da FcgidOutputBufferSize
variável é "65536", conforme mencionado na página da web do Apache para a diretiva correspondente . Portanto, pode ser necessário ajustar esse valor adequadamente se outro valor for definido em seu ambiente.
Meu ambiente
- WampServer 2.5
- Apache 2.4.9
- PHP 5.5.19 VC11, x86, Non Thread Safe
- mod_fcgid / 2.3.9
- Windows 7 Professional x64
Exemplo de host virtual
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/example"
ServerName example.local
FcgidOutputBufferSize 0
<Directory "d:/wamp/www/example">
Require all granted
</Directory>
</VirtualHost>