Domanda

Ho uno script di data mining piuttosto lungo e in alcune parti riporto alcune informazioni alla pagina (durante un ciclo foreach, in realtà).

Tuttavia noto che le informazioni vengono inviate al browser non immediatamente come speravo, ma in "segmenti".

Esiste qualche funzione che posso utilizzare dopo l'eco per inviare immediatamente tutti i dati al browser?

Grazie.

È stato utile?

Soluzione

Probabilmente si desidera flush(). Tuttavia, PHP stia utilizzando il buffer di uscita. Ci sono alcuni modi in cui questo può cambiare le cose, ma in poche parole, è possibile flush(), quindi ob_flush().

Altri suggerimenti

Puoi provare a utilizzare flush () dopo ogni eco, ma anche questo non garantirà una scrittura al cliente in base al server web che si sta eseguendo.

Sì, imbottitura l'output a 1024 byte causerà maggior parte dei browser per avviare la visualizzazione del contenuto.

Ma impariamo anche da @ risposta di nessuno di mettere in discussione " Come uscita a filo dopo ogni `echo` chiamare? " che il browser 1024 byte effetto tampone verifica solo quando il browser deve indovinare la codifica caratteri della pagina, che può essere prevenuta con l'invio l'intestazione corretta Content-Type (ad esempio, . "Content-Type: text / html; charset = utf-8"), oppure specificando il set di caratteri contenuti attraverso opportuni meta tag html. E ha funzionato anche per me in tutti i browser.

Quindi, in pratica, tutto quello che dovete fare è:

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

Con nessun requisito per chilo in più o vampate di calore, che è di grande beneficio cosmetico per il codice! Naturalmente, le intestazioni devono essere inviate prima di qualsiasi contenuto, e si deve anche assicurarsi che nessun buffer di uscita è in corso.

problema definitivamente risolto per me! Si prega di risposta (+1) @ di nessuno d'altra domanda pure se funziona per voi. Se, anche se, si incontra ancora problemi, vi suggerisco di controllare le risposte a questa altra questione per altre situazioni specifiche che potrebbero presumely prevenire vampate implicita di funzionare correttamente.

Tieni inoltre presente che alcuni browser non inizieranno a visualizzare nulla finché il corpo della risposta non conterrà una certa quantità di dati, ad esempio 256 o 1024 byte.Ho visto applicazioni prima che riempissero i dati con un commento lungo 1024 caratteri nella parte superiore della pagina, prima che eseguissero uno svuotamento.È un po' un trucchetto, ma necessario.

Questo vale per Internet Explorer e Safari IIRC.

COSÌ,

  • Se è il primo flush, assicurati di aver generato almeno 1024 byte fino ad ora (escluse le intestazioni HTTP).
  • Chiama flush()
  • Se riesci a determinare che è presente un buffer di output, emetti ob_flush()

Mi piace semplicemente usare

while (ob_get_level()) ob_end_flush();

vicino all'inizio della mia sceneggiatura da qualche parte, e poi solo

flush();

ogni volta che voglio sciacquare.Ciò presuppone che tu non voglia alcun buffering dell'output, anche se è stato impostato prima dello script (come in una configurazione PHP.ini o htaccess).

Si dovrebbe essere in grado di usare qualcosa di simile per forzare l'uscita da inviare immediatamente spostato. Mettilo alla parte del codice che si desidera l'uscita da inviare.

flush();
ob_flush();

Accidenti! Ho finalmente trovato la risposta al problema del buffer di Google Chrome! Grazie a boysmakesh per la spinta nella direzione giusta. Ecco la funzione che uso:

function buffer_flush(){

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

    if(ob_get_length()){

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

    }

    @ob_start();

}

E questo è come lo chiamo io:

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.

Per funzionare perfettamente questo fuori in Google Chrome, provate questo:

$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 sta inviando 512 byte prima di inviare ogni eco. Non dimenticate di mettere <BR> alla fine del contenuto prima di filo. Altrimenti non funzionerà in Chrome, ma funziona in IE.

I dati che abbiamo imbottitura è il browser dipendente. Per alcuni browser è sufficiente avere 256 byte, ma alcuni hanno bisogno di 1024 byte. Per Chrome è 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);

php 5.5 in esecuzione su IIS 7, IE 11 (Windows Server) Ho trovato questo ha funzionato come le righe del file di apertura. Nota mettere l'istruzione while prima che il colpo di testa ha causato un errore di intestazione già scritto.

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

Ulteriori riferimenti a ob_flush () nello script causato un buffer non esiste errore.

Questo ha funzionato bene quando stavo elaborazione di un file e l'invio di istruzioni SQL per il browser, tuttavia quando ho collegato il server MS (2008) db ho avuto nessun input restituito fino alla sceneggiatura aveva completato.

questa combinazione, infine, ha lavorato per me, in base alla risposta del thomasrutter

while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top