No Symfony (1 e 2), a saída do controlador apenas é enviada após o processamento interno.
Para uma saída constante, em processos demorados, precisamos outra abordagem,
chamando o flush manualmente e seguindo o caminho Keep-Alive.
A necessidade
A CamelSpiderBundle possui um controller que executa a CamelSpider e isto pode demorar um pouco.
É necessário que exista uma saída informativa e uma negociação com o navegador para que não seja interrompida a exibição.
Solução:
//….
public function captureAction($id)
{
$response = new Response();
$response->headers->set(‘Content-Encoding’, ‘chunked’);
$response->headers->set(‘Transfer-Encoding’, ‘chunked’);
$response->headers->set(‘Content-Type’, ‘text/html’);
$response->headers->set(‘Connection’, ‘keep-alive’);
$response->sendHeaders();
flush();
ob_flush();
echo “<html><head><title>Capture</title></head><body><pre>”;
$this->get(‘camel_spider.launcher’)->checkUpdates($id);
echo “nnnn<b>Done</b>.”;
echo “</pre></body></html>”;
return $response;
}
//…..
Você pode visualizar o arquivo completo
aqui
Algumas informações relevantes: