Chiamando ob_flush () e flush (), tuttavia il browser non mostra alcun output fino al termine dello script

Ciao per favore guarda sotto il codice:

<?php ob_start(); echo "Start ...<br />\n"; for( $i = 0 ; $i < 10 ; $i++ ) { echo "$i<br />\n"; ob_flush(); flush(); sleep(1); } echo "End ...<br />\n"; ?> 

Non è corretto ? sono stato testato ma il mio output mostra quando lo script è terminato, hai qualche soluzione?

Hey amico, ero bloccato anche in questo problema e finalmente ho trovato la soluzione giusta per te

devi aggiungere il tipo di contenuto per la tua pagina puoi farlo in due modi: 1. usando il tag html

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

Ex.

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Wp Migration</title> </head> <body> <?php for($i=0;$i<70;$i++) { echo 'printing...<br>'; ob_flush(); flush(); sleep(3); } ?> </body> </html> 
  1. usando la function di intestazione php

    <?php header( 'Content-type: text/html; charset=utf-8' ); ?>

Ex.

 <?php header( 'Content-type: text/html; charset=utf-8' ); for($i=0;$i<70;$i++) { echo 'printing...<br>'; ob_flush(); flush(); sleep(3); } ?> 

Ti auguro il meglio

Alcuni browser devono ricevere alless 256 caratteri prima di iniziare a eseguire il rendering. Hai già provato a produrre più output come:

 echo str_repeat('&nbsp;', 50) . "$i<br />\n"; 

MODIFICA :

Sotto Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9 sono stato in grado di riprodurre il problema dell'OP impostando

 zlib.output_compression = On 

Spegnendolo di nuovo da

 zlib.output_compression = Off 

ha fatto funzionare la sceneggiatura come desiderato.

Prova a rimuovere la chiamata a ob_start() sulla prima row: non è necessario triggersre il buffering dell'output e probabilmente causerà problemi, qui.

Ho provato il tuo codice:

  • Se ob_start() viene chiamato sulla prima row, vedo solo l'output al termine dello script, dopo 10 secondi
  • Se rimuovo quella chiamata a ob_start() , quindi, vedo una row di output each secondo, non appena viene visualizzata sullo standard output.

Utilizzando Chrome, ho scoperto che sono necessari molti più byte per bypassare il buffer del browser. Nel mio caso 4096 byte andavano bene:

 echo str_repeat(' ', 4096); 

Inoltre, l'aggiunta di alcuni elementi HTML all'inizio sembrava essere obbligatoria:

 echo $content . '<br />'; 

Sul mio sistema sembra che FF4 abbia bisogno di più di 256 byte per avviare il rendering di quello che arriva dal lato server, quindi ho risolto con questo all'inizio:

 while (@ob_end_flush()); echo(str_repeat(' ',1024)); // ...etc... 

Ho scoperto che ciò era dovuto al fatto che la compressione gzip di Apache era in uso per il mio caso.

Per distriggersre gzip solo per lo script 'flushing', ho creato un nuovo file .htaccess nella directory in cui risiede lo script di output continuo, con il seguente:

 <IfModule mod_env.c> SetEnv no-gzip 1 </IfModule> 

Flushing sta funzionando come previsto di nuovo.

Per le persone che usano FCGI / cgi veloce.

 FcgidOutputBufferSize 0 

È corretto. Funziona bene per me da CLI con PHP 5.3.3. Se non funziona, l'installazione di PHP potrebbe avere disabilitato il buffering dell'output.

Suggerirei anche di mettere ob_end_flush () alla fine dello script per chiudere il buffer di output.

Un piccolo problema con IE8 e flush (); è che se stai "svuotando" le righe in una tabella. IE mostrerà le tabelle solo quando saranno complete. Questo era il mio problema, e la modifica dei contenitori dalle righe della tabella alle div ha risolto il problema.

Devi aggiungere un file .htaccess per disabilitare l'output di gzip

 <IfModule mod_env.c> SetEnv no-gzip 1 </IfModule> 

Sto usando framework laravel e il buffering non ha funzionato ma. Questa è una soluzione:

 header( 'Content-type: text/html; charset=utf-8' ); ob_start(); ob_end_flush(); ob_flush(); flush(); for($i = 1;$i<= 5;$i++){ echo $i; ob_flush(); flush(); sleep(3); } 

Devi usare prima ob_end_flush ();

Questo stream funziona anche con Laravel

 ob_implicit_flush(true); echo "Processing ... "; // Or give out JSON output ob_flush(); sleep(5); //A time-consuming synchronous process (SMTP mail, maybe?) echo "Done";