<?php
ob_start();
echo 'test';
ob_end_flush();
flush();
sleep(10);
Tentei gerar a resposta para a solicitação ajax antes que a conexão terminasse, mas não funcionou - ele esperará 10 segundos antes de obter a resposta com êxito. É o problema do servidor http, no meu caso, Apache? que ele ecoa a resposta imediatamente?
Responder1
Embora flush()
, ob_end_flush()
e ob_flush()
deva garantir que a saída seja enviada ao servidor, descobri que o PHP às vezes não perdoa configurações específicas de software.
Especialmente no Windows, o buffer de saída pode ser difícil de configurar e a única maneira que descobri que funciona de maneira confiável entre sistemas é redefinir o buffer de saída em cada liberação da seguinte forma:
<?php
obf_start();
for($i=0;$i<70;$i++) {
echo 'printing... ', microtime(true), '<br />';
if($i % 3 == 2) obf_flush();
usleep(300000);
}
function obf_start() {
ob_start();
}
function obf_flush() {
ob_end_flush();
ob_flush();
flush();
obf_start();
}
É uma solução feia? É sim. Mas atétodos os bugs relacionados ao buffer de saídasão corrigidos, não vejo essa solução alternativa desaparecendo no código de produção tão cedo.
Observe também que alguns softwares antivírus (Panda AV e outros) e proxies reterão todos os dados até que o soquete seja fechado. Você não pode garantir que todos os clientes receberão dados liberados adequadamente.
Responder2
A maneira mais simples de saber se algo é um problema de servidor ou navegador/biblioteca é monitorar a solicitação ao vivo. As 2 maneiras mais simples de fazer isso no seu caso são:
- Bug de fogo: Esta extensão do Firefox mostrará todas as suas solicitações AJAX ao vivo à medida que forem enviadas e mostrará a resposta assim que for recebida pelo navegador.
- Captura de tráfego: Use uma ferramenta como o Wireshark para ver qualquer tipo de solicitação sendo enviada e o tráfego TCP retornando do servidor em tempo real.
Se você vir os dados retornando imediatamente, mas demorando 10 segundos para serem exibidos, seu navegador ou biblioteca AJAX está aguardando o fechamento da conexão antes de processar a resposta. Se demorar 10 segundos para você receber algo de volta, seu servidor ou módulo PHP é o culpado aqui.