Estranho buffer de saída do PHP

1

PHP:

header('Content-type: text/plain');

for ($i=0; $i<10; $i++){
  echo "$i\r\n";
  ob_flush();
  flush();
  sleep(1);
}

Eu testei o script acima em dois servidores diferentes. Ambos respondem números 0 ... 9 em todas as linhas. No caso do primeiro servidor, cada número é recebido a cada segundo. No caso do segundo servidor, não há saída para 10 segundos e toda a saída é exibida de uma só vez. O que pode estar errado no segundo caso? Eu tentei várias funções de controle de saída, mas isso não ajudou.

O conjunto de cabeçalhos de resposta em ambos os casos é praticamente o mesmo:

HTTP/1.1 200 OK
Date: Mon, 03 Jan 2011 19:21:21 GMT
Server: Apache
X-Powered-By: PHP/5.2.14
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/plain
    
por radek-k 03.01.2011 / 20:32

3 respostas

2

Você precisa transformar output_buffering em "Off" no php.ini e reiniciar o apache, o padrão para output_buffering é 4096, o que evita que seu ob_flush () e flush () entrem em vigor. Você também está perdendo um ob_start (); no início do seu código de exemplo.

output_buffering = Desligado

    
por 03.01.2011 / 23:50
0

O buffer de saída pode ser chamado em tempo de execução ou ativado por padrão (como no caso do segundo servidor).

Execute <?php var_dump( ini_get('output_buffering') ); ?> ou <?php phpinfo(); ?> para ver se está ativado no servidor que você está usando.

Ref: manual do PHP

    
por 03.01.2011 / 21:31
0

Quando o PHP libera buffers, pouco tem a ver com quando o servidor web decide gravar a saída - e o servidor web pode enviar respostas parciais (relativamente incomuns) ou, como no seu caso, respostas em partes. Webservers não fornecem a facilidade de controle direto sobre o fluxo de saída. Nem deveriam. Usando o buffer de saída em PHP apenas adia chunking ligeiramente.

Se você deseja produzir saída no navegador enquanto o código ainda está em execução, essa não é a maneira de fazer isso - bifurque um processo separado (preferencialmente em um novo grupo de sessão) e grave uma resposta stub no navegador - envie atualizações para o stub usando o Ajax (opcionalmente com longa pesquisa).

    
por 04.01.2011 / 01:56

Tags