Este é um problema do servidor http?

Este é um problema do servidor http?
<?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.

informação relacionada