Pergunta

Eu tenho um script bastante mineração de dados longo e em partes do que eu eco de algumas informações para a página (durante um loop foreach, na verdade.)

No entanto, estou percebendo que a informação está sendo enviada para o browse não imediatamente como eu esperava, mas em 'segmentos'.

Existe alguma função que eu posso usar depois do meu echo para enviar todos os dados para o navegador imediatamente?

Graças.

Foi útil?

Solução

Você provavelmente quer flush(). No entanto, pode ser PHP usando o buffer de saída. Existem algumas maneiras que isto pode mudar as coisas, mas em poucas palavras, você pode flush(), então ob_flush().

Outras dicas

Você pode tentar usar flush () após cada eco, mas mesmo isso não garante uma gravação para o cliente, dependendo do servidor web que você está executando.

Sim, acolchoar sua saída a 1024 bytes fará com que a maioria dos navegadores para começar a exibir o conteúdo.

Mas também aprender com resposta de @ ninguém à pergunta " Como libera a saída após cada `chamada echo`? " que a 1024 bytes efeito tampão navegador só acontece quando o navegador tem de adivinhar a codificação de caracteres da página, que pode ser prevenida através do envio de cabeçalho adequada Content-Type (por exemplo, . "Content-Type: text / html; charset = utf-8"), ou especificando o charset conteúdo através de tags HTML meta apropriadas. E funcionou bem para mim em todos os navegadores.

Então, basicamente, tudo o que se precisa fazer é:

header('Content-Type: text/html; charset=utf-8');
ob_implicit_flush(true);

Com nenhuma exigência para cobertura extra ou rubor, que é de grande benefício cosmético para o código! Claro, os cabeçalhos devem ser enviados antes de qualquer conteúdo, e um também tem que garantir que nenhum buffer de saída está acontecendo.

O problema definitivamente resolvido para mim! Por favor (+1) @ resposta de ninguém sobre a outra questão, bem como se ele funciona para você. Se, apesar de, ainda encontra problemas, sugiro verificar as respostas para essa outra questão para outras situações específicas que podem presumely evitar rubor implícita de funcionar corretamente.

Note também que alguns navegadores não vai começar a exibir qualquer coisa até que o corpo da resposta contém uma certa quantidade de dados - como 256 ou 1024 bytes. Eu vi aplicativos antes que os dados de almofada com 1.024 caracteres comentário perto do topo da página, antes de fazer um flush. É um pouco de um truque, mas necessário.

Isto aplica-se ao Internet Explorer e Safari IIRC.

Assim,

  • Se for o primeiro flush, verifique se você tem saída pelo menos 1024 bytes sofar (não incluindo cabeçalhos HTTP).
  • flush Call ()
  • Se você pode determinar que não há buffer de saída no lugar, ob_flush questão ()

Eu gosto de usar apenas

while (ob_get_level()) ob_end_flush();

perto do início do meu script em algum lugar, e depois é só

flush();

sempre que eu quiser flush. Isso pressupõe que você não quer qualquer buffer de saída em tudo, mesmo se ele foi criado antes de seu script (como em um PHP.ini ou configuração htaccess).

Você deve ser capaz de usar algo como isto para a saída de força a ser enviada immeadiately. Coloque-o na parte do código que você deseja que a saída para ser enviada.

flush();
ob_flush();

Ufa! Eu finalmente encontrei a resposta à questão tampão do Google Chrome! Graças a boysmakesh para o impulso na direção certa. Aqui está o uso da função I:

function buffer_flush(){

    echo str_pad('', 512);
    echo '<!-- -->';

    if(ob_get_length()){

        @ob_flush();
        @flush();
        @ob_end_flush();

    }

    @ob_start();

}

E é assim que eu chamá-lo:

show_view('global', 'header'); // Echos the <html><head>... tags and
                               // includes JS and CSS.

show_view('global', 'splash_screen'); // Shows a loading image telling
                                      // the user that everything's okay.

buffer_flush(); // Pretty obvious. At this point the loading view shows
                // up on every browser i've tested (chrome, firefox,
                // IE 7 & 8)

show_view('global', 'main'); // Has a loop that echos "Test $i<br>" 5
                             // times and calls buffer_flush() each time.

show_view('global', 'footer'); // End the html page and use JQuery to
                               // fade out the loading view.

Para funcionar perfeitamente isso no Google Chrome, tente o seguinte:

$i = 0;
$padstr = str_pad("",512," ");
echo $padstr;

while ($i <= 4){
    $padstr = str_pad("",512," ");
    echo $padstr;
    echo "boysmakesh <BR> ";
     flush();
    sleep(2);
    $i = $i + 1;
}

Ee está enviando 512 bytes antes de enviar cada eco. Não se esqueça de colocar <BR> no final do conteúdo antes de lavar. Então ele não vai funcionar no Chrome, mas funciona no IE.

O preenchimento nos dados é o navegador dependente. Para alguns navegadores é o suficiente para ter 256 bytes, mas alguns precisam de 1024 bytes. Para cromo é 512.

ignore_user_abort(TRUE); // run script in background
set_time_limit(0); // run script forever
$interval=150000;
$i = 0;

if(
  strpos($_SERVER["HTTP_USER_AGENT"], "Gecko") or
  strpos($_SERVER["HTTP_USER_AGENT"], "WebKit")
){
  # important to change browser into quirks mode
  echo '<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
}

function buffer_flush(){
    echo "\n\n<!-- Deal with browser-related buffering by sending some incompressible strings -->\n\n";
    for ( $i = 0; $i < 5; $i++ )
        echo "<!-- abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono -->\n\n";

    while ( ob_get_level() )
        ob_end_flush();

    if(ob_get_length()){
        @ob_flush();
        @flush();
        @ob_end_flush();
    }
    @ob_start();
}

ob_start(); 

do{

  if($i<10){
    buffer_flush(); 
    echo ". ";    
    buffer_flush(); 
    usleep($interval);

  } else {
    echo sprintf("<pre>%s</pre>", print_r($_SERVER,true));
    break;
  }

  $i++;

}while(true);

rodando o PHP 5.5 no IIS 7, IE 11 (vitória servidor) Eu encontrei este trabalhou como as linhas do arquivo de abertura. Nota colocar o while antes do cabeçalho causou um cabeçalho de erro já está escrito.

header('Content-Type: text/html; charset=utf-8');
while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);

Outras referências para ob_flush () no script causou um buffer não existe erro.

Esta funcionou bem quando eu estava processando um arquivo e enviar instruções SQL para o navegador, no entanto, quando me juntei a (servidor ms 2008) db eu não tinha entrada retornou até o roteiro tinha terminado.

Esta combinação finalmente funcionou para mim, com base na resposta do thomasrutter

while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top