Pregunta

Tengo un guión bastante larga minería de datos, y en partes de que me hago eco de una información a la página (en un bucle foreach, en realidad.)

Sin embargo, me doy cuenta de que la información se envía a la de exploración no inmediatamente como había esperado, pero en 'segmentos'.

¿Hay alguna función que pueda usar después de mi eco para enviar todos los datos al navegador de inmediato?

Gracias.

¿Fue útil?

Solución

Es posible que desee flush(). Sin embargo, PHP puede ser el uso de búferes de salida. Hay algunas maneras en que esto puede cambiar las cosas, pero en pocas palabras, se puede flush(), entonces ob_flush().

Otros consejos

Puede intentar usar flush () después de cada eco, pero incluso eso no le garantiza una grabación en el cliente en función del servidor Web que se está ejecutando.

Sí, el relleno de la salida a 1024 bytes hará que la mayoría de los navegadores para empezar a mostrar el contenido.

Pero también aprendemos de @ respuesta de nadie a la pregunta "¿Cómo ras después de cada salida de `echo` llamar? " que el 1024 bytes navegador efecto amortiguador sólo ocurre cuando el navegador tiene que adivinar la codificación de caracteres de la página, que se puede prevenir mediante el envío de la cabecera Content-Type adecuado (por ejemplo, . "Content-Type: text / html; charset = UTF-8") o especificando el conjunto de caracteres contenido a través de meta-tags hTML apropiados. Y funcionó tan bien para mí en todos los navegadores.

Así que, básicamente, todo lo que hay que hacer es:

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

Con ningún requisito para carnes de más o rubor, que es de gran beneficio cosmético para el código! Por supuesto, las cabeceras que ser enviado antes de cualquier contenido, y también hay que asegurarse de que no hay almacenamiento temporal de salida está pasando.

Problema resuelto definitivamente para mí! Por favor, conteste (1) @ de nadie en la otra pregunta también si funciona para usted. Si, aunque, todavía se encuentra con problemas, yo sugiero revisar las respuestas a esta otra pregunta para otras situaciones específicas que podrían prevenir el volcado implícito presumely funcione correctamente.

Tenga en cuenta también que algunos navegadores no empezar a mostrar nada hasta que el cuerpo de la respuesta contiene una cierta cantidad de datos - como 256 o 1024 bytes. He visto las aplicaciones antes de que los datos de la almohadilla con un carácter 1,024 comentario largo en la parte superior de la página, antes de que hagan un color. Es un poco de un truco, pero es necesario.

Esto se aplica a Internet Explorer y Safari IIRC.

Por lo tanto,

  • Si es la primera descarga, asegúrese de que tiene salida al menos 1024 bytes sofar (sin incluir las cabeceras HTTP).
  • a nivel de llamada ()
  • Si se puede determinar que hay búfer de salida en su lugar, tema ob_flush ()

Me gusta usar simplemente

while (ob_get_level()) ob_end_flush();

cerca del inicio de mi guión en algún lugar, y luego simplemente

flush();

cada vez que quiero tirar. Esto supone que no desea ningún búfer de salida en absoluto, incluso si se creó antes de la secuencia de comandos (como en un PHP.ini o configuración .htaccess).

Usted debe ser capaz de usar algo como esto para forzar la salida para ser enviado Golden Retriever. Ponerlo en la parte del código que desea que la salida se ha enviado.

flush();
ob_flush();

¡Uf! Finalmente encontré la respuesta a la cuestión de la memoria intermedia del Google Chrome! Gracias a boysmakesh para el empuje en la dirección correcta. Aquí está la función que utilizo:

function buffer_flush(){

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

    if(ob_get_length()){

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

    }

    @ob_start();

}

Y así es como yo lo llamo:

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 a la perfección esta en Google Chrome, intente lo siguiente:

$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án enviando 512 bytes antes de enviar cada eco. No se olvide de poner <BR> al final del contenido antes ras. De lo contrario no va a funcionar en Chrome, pero funciona en IE.

El acolchado que los datos depende del navegador. Para algunos navegadores es suficiente para tener 256 bytes, pero algunos necesitan 1.024 bytes. Para el cromo 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);

Ejecutar PHP 5.5 en IIS 7, IE 11 (ganar servidor) me encontré con este trabajo como las primeras líneas del archivo. Nota poner la declaración de tiempo antes de la cabecera provocó un error de cabecera ya escrito.

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

Otras referencias a ob_flush () en la secuencia de comandos causó un tampón no existe error.

Esto funcionó bien cuando estaba procesando un archivo y enviar instrucciones SQL para el navegador, sin embargo cuando conectado al servidor (MS 2008) db no tenía ninguna entrada devuelta hasta que el guión había completado.

esta combinación finalmente funcionó para mí, basado en la respuesta de thomasrutter

while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top