Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia galera,
Eu tinha visto isso uma vez e não me lembro mais onde vi. Procurei no Google e no fórum mas não achei nenhuma resposta parecida.
Seguinte, tenho um script que demora muito pra rodar, e a saida dele é colocada em uma tabela. Eu queria que a medida que fosse executado e coletado esses dados, já imprimisse o seu valor na tabela.
Da forma que está ele só imprime o resultado ao final do script, que eu não quero desse jeito. O código é esse:
<table border="1" cellpadding="3">
<tr>
<th>N.</td>
<th>Passo 1</td>
<th>Passo 2</td>
<th>Passo 3</td>
</tr>
<?
$dados = array(); //aqui vem os dados de um array
for ($i=0;$i<count($dados);$i++) {
$dado = $dados[$i];
$cont = $i + 1;
if (trim($dado!='')) {
echo "<tr>\n";
echo "<td>$cont</td>";
echo "<td>$dado</td>\n";
echo "<td>\n";
//aqui tem um while que demora cerca de 5 segundo para ser executado
echo "saida aqui";
echo "</td>\n";
echo "<td>\n";
//aqui tem outro while demorado
echo "outra saida";
echo "</td>\n";
echo "</tr>\n";
} //if vazio
} //for
?>
</table>
Pois é... eu queria que à medida que fosse coletando esses dados, ele fosse imprimindo a saida, pq da forma que está só me mostra toda a saída, e a pagina fica em branco até que se complete o script!
Alguém pode me ajudar... :mellow:
Vários servidores, especialmente no Win32, irão continuar colocando a saída do script em buffer até que ele termine antes de enviar os resultados para o browser.
Módulos de servidor para o Apache como o mod_gzip podem fazer buffer por si o que fará com que flush() não resulte em os dados serem enviados imediatamente para o cliente.
mesmo o browser pode fazer buffer antes de mostrar o conteúdo. Netscape, por exemplo, guarda o texto em buffer até que receba um end-of-line ou o inicio de uma tag, e não irá mostrar tabelas até que a tag </table> da tabela mais de fora seja vista.
Algumas versões do Microsoft Internet Explorer somente começaram a mostrar dados depois de terem recebido 256 bytes de saída, então você vai precisar enviar espaço em branco antes de descarregar para os browser para mostrar a página.
Como meu local server é windows, não consigo enviar dados para o browser durante o processamento. Somente após todo o processo e o buffer estiver completo.
Alterando a diretiva do php.ini para off.
output_buffering = Off
O output funcionou no navegador Internet Explorer. No Firefox não funciona, ele primeiro recebe todos os dados, e então, os envia.
Código utilizado:
$count = 0;
while($count < 10){
echo $count.' <br />' , PHP_EOL;
$count++;
flush();
sleep(1);
}
Necessita alterar a diretiva e utilizar a função flush(). Isso para um servidor windows e PHP 5.4.3.
PHP_EOL (end of line) não é necessário para identificar o final da linha. Entretanto, usei-o para verificar se funcionaria no Firefox, o qual não funcionou.
http://www.php.net/manual/pt_BR/function.ob-start.php