Frage

Ich habe ein ziemlich langen Data-Mining-Skript, und in Teilen davon Echos mir einige Informationen auf der Seite (bei einer foreach-Schleife, eigentlich.)

Allerdings bin ich zu bemerken, dass die Informationen an die browse gesendet wird nicht sofort, wie ich gehofft hatte, aber in ‚Segmente‘.

Gibt es eine Funktion, die ich nach meiner Echo verwenden können alle Daten an den Browser senden sofort?

Danke.

War es hilfreich?

Lösung

Sie wollen wahrscheinlich flush(). PHP kann jedoch sein, die Ausgabe-Pufferung verwendet wird. Es gibt ein paar Möglichkeiten, dass diese Dinge ändern können, aber auf den Punkt gebracht, können Sie flush(), dann ob_flush().

Andere Tipps

Sie können versuchen, bündig mit () nach jedem Echo, aber auch das wird ein Schreiben auf das Client nicht garantieren, auf dem Webserver ab, die Sie ausführen.

Ja, Ihre Ausgabe zu 1024 Bytes padding werden die meisten Browser veranlassen, den Inhalt zu starten angezeigt wird.

Aber wir lernen auch von @ niemand Antwort „ zu hinterfragen Wie bündig Ausgang nach jedem `echo` nennen? “, dass die 1024 Bytes Browser Pufferwirkung geschieht nur, wenn der Browser die Zeichenkodierung der Seite zu erraten hat, die durch das Senden der richtigen Content-Type-Header verhindert werden kann (zB . "Content-Type: text / html; charset = utf-8") oder durch den Inhalt charset durch entsprechende hTML-Meta-Tags angeben. Und es funktionierte auch für mich in allen Browsern.

Also im Grunde alles, was man tun müssen, ist:

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

Ohne Anforderung für zusätzliche Polsterung oder Spülung, die für den Code der großen kosmetischen Vorteil ist! Natürlich haben Header vor den Inhalt gesendet werden, und man hat auch vor sich geht keine Ausgabepufferung, um sicherzustellen.

Problem auf jeden Fall für mich gelöst! Bitte (+1) @ niemand Antwort auf die andere Frage, wie gut, wenn es für Sie arbeitet. Wenn, obwohl nach wie vor ein Problem stößt, schlage ich vor, die Überprüfung der Antworten auf diese andere Frage für andere spezifische Situationen aus, die presumely implizite Spülung richtig von der Arbeit verhindern könnten.

Beachten Sie auch, dass einige Browser nichts anzeigt beginnen, bis der Körper der Antwort eine bestimmte Menge an Daten enthält - wie 256 oder 1024 Bytes. Ich habe Anwendungen mit 1024 Zeichen langen Kommentar in der Nähe der oben auf der Seite vor diesen Pad-Daten zu sehen, bevor sie einen Flush tun. Es ist ein bisschen wie ein Hack, aber notwendig.

Dies gilt für Internet Explorer und Safari IIRC.

So

  • Wenn es das erste bündig ist, stellen Sie sicher, dass Sie Ausgang mindestens 1024 Bytes sofar (ohne HTTP-Header) haben.
  • Anruf flush ()
  • Wenn Sie feststellen, dass es Ausgabepufferung an seinem Platz ist, Ausgabe ob_flush ()

Ich mag nur verwenden

while (ob_get_level()) ob_end_flush();

in der Nähe von Beginn meiner Skript irgendwo, und dann einfach

flush();

, wenn ich spülen will. Dies setzt voraus, dass Sie wollen keine Ausgabepufferung überhaupt, selbst wenn sie vor Ihrem Skript (wie in einem PHP.ini oder .htaccess-Konfiguration) eingestellt.

Es soll möglich sein, so etwas zu verwenden, um Ausgaben zu zwingen immeadiately gesendet werden. Legen Sie es auf den Teil des Codes Sie die Ausgabe gesendet werden soll.

flush();
ob_flush();

Puh! Ich fand schließlich die Antwort auf Google Chrome Puffer Problem! Danke für den Schub in der richtigen Richtung boysmakesh. Hier ist die Funktion, die ich verwende:

function buffer_flush(){

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

    if(ob_get_length()){

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

    }

    @ob_start();

}

Und das ist, wie ich es nennen:

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.

diese in Google Chrome aus, um einwandfrei funktionieren, versuchen Sie dies:

$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 senden 512 Bytes vor dem Senden jedes Echo. Vergessen Sie nicht, <BR> am Ende des Inhalts, bevor Sie bündig zu setzen. Sonst wird es nicht in Chrome arbeiten, aber funktioniert im Internet Explorer.

Die Daten, die wir padding ist Browser abhängig. Bei einigen Browsern ist es genug, um 256 Bytes zu haben, aber einige müssen 1024 Bytes. Für Chrom ist es 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);

Ausführen von PHP 5.5 auf IIS 7, IE 11 (win-Server) Ich fand diese als die ersten Zeilen der Datei gearbeitet. Beachten Sie die while-Anweisung setzen, bevor der Header einen Header bereits geschrieben Fehler verursacht hat.

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

Weitere Referenzen () im Skript ob_flush einen Puffer verursacht keine Fehler vorhanden sind.

Das funktionierte gut, wenn ich eine Datei Verarbeitung und SQL-Anweisungen an den Browser senden, aber wenn ich den db (ms Server 2008) angeschlossen hatte ich keine Eingabe zurückgegeben, bis das Skript abgeschlossen hatte.

Diese Kombination arbeitete schließlich für mich, basierend auf thomasrutter Antwort

while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top