2011-01-26 43 views
6

Quiero añadir Transfer-Encoding: chunked cabecera al archivo que estoy outputing (es sólo genera texto plano), pero cuando agrego:"Transfer-Encoding: fragmentada" de cabecera en PHP

header("Transfer-Encoding: chunked"); 
flush(); 

el navegador doesn no quiero abrir el archivo

La página web en ... podría ser temporalmente o se haya trasladado de forma permanente a una nueva dirección web.

¿qué tengo que hacer para que funcione?

+0

¿También está enviando un encabezado 'Content-Length'? – drudge

+0

no. Debería enviarlo? – Ddwerffdsf

+0

No, no debe incluir el encabezado 'Content-Length'.El objetivo de 'Transfer-Encoding: chunked' es que su contenido se genere de forma dinámica, por lo que no conoce la longitud del contenido a priori y, por lo tanto, no puede establecer este encabezado. –

Respuesta

2

Debe enviar el Content-Length con cada fragmento que envíe. Mira Wikipedia para una primera impresión, cómo se ve una codificación fragmentada. No es tan trivial y en muchos casos es demasiado grande.

Actualización: Primero envíe los encabezados, porque siempre deben enviarse antes de cualquier contenido (también con codificación fragmentada). Luego, envía (por cada porción) el tamaño (en hexadecimal) seguido del contenido. Recuerde flush() después de cada pedazo. Por último, debe enviar un fragmento de tamaño cero para asegurarse de que la conexión se cierra correctamente.

Su no probados, sino algo así como el código

header("Transfer-Encoding: chunked"); 
echo "5\r\n"; 
echo "Hello"; 
echo "\r\n\r\n"; 
flush(); 
echo "5\r\n"; 
echo "World"; 
echo "\r\n"; 
flush(); 
echo "0\r\n\r\n"; 
flush(); 
+0

¿cómo puedo hacer eso con php? – Ddwerffdsf

+0

Realmente no hay necesidad de pensar en ello, a menos que deba enviar contenido de algunos MB. Sin embargo, actualizaré mi respuesta con las instrucciones básicas – KingCrunch

+0

y cómo convertir el texto en fragmentos? por ejemplo, si mi salida es 'Hello_World _ :)' – Ddwerffdsf

-2

Uso ob_flush(); antes flush();

muestra:

<?php 
     header('Content-Encoding', 'chunked'); 
     header('Transfer-Encoding', 'chunked'); 
     header('Content-Type', 'text/html'); 
     header('Connection', 'keep-alive'); 

     ob_flush(); 
     flush(); 

     $p = ""; //padding 
     for ($i=0; $i < 1024; $i++) { 
      $p .= " "; 
     }; 
     echo $p; 

     ob_flush(); 
     flush(); 

     for ($i = 0; $i < 10000; $i++) { 
      echo "string"; 
      ob_flush(); 
      flush(); 
      sleep(2); 
     } 

?> 
2

Como miembros anteriores dijo que hay que seguir el formato de codificación de transferencia fragmentada.
En el próximo ejemplo voy a mostrar cómo se puede utilizar la función de un usuario a seguir las reglas de formato:

<?php 
//set headers 
header('Transfer-Encoding: chunked'); 
header('Content-Type: text/html'); 

//browsers collect first 1024 bytes 
//and show page only if bytes collected 
//so we will use space padding. 
//if you cannot understand what it means 
//check script with PADDING=0 
define("PADDING", 16); 

//caret return and new line characters as constant 
define("RN", "\r\n"); 

//user function what get current output buffer data 
//and prefixes it with current buffer length. 
//next it call flush functions 
function flush_data(){ 
    $str=ob_get_contents(); 
    ob_clean(); 
    echo dechex(strlen($str)).RN.$str.RN; 
    ob_flush(); 
    flush(); 
} 

//default HTML 5 page 
echo "<!doctype html><html><head><title>Transfer-Encoding: chunked</title>"; 
echo "<script>"; 

//+padding 
for($i=0;$i<PADDING;$i++){ 
    //64 spaces (1 block) 
    echo "                "; 
} 
echo "</script></head><body><div>"; 

//current output buffer will shown immediately in browser 
//after this function 
flush_data(); 

//cycle wait 1 sec before next iteration 
for($i=0;$i<5;$i++) 
{ 
    //print iteration number 
    echo "$i<br>"; 
    flush_data(); 
    sleep(1); 
} 

echo "</div></body></html>".RN; 

//terminating part of encoding format 
flush_data(); 
echo "0\r\n\r\n"; 
ob_flush(); 
?> 

Notas:

  1. Comprobar si «implicit_flush» es En en su php. ini
  2. Sepa si sobrepasa el buffer de salida («output_buffering» en php.ini) se vaciará automáticamente.
1

Para mí cuando estaba intentando algo con "Transfer-Encoding: fragmentada" tuve que usar este código para hacer que funcione:

<?php 


echo "data"; 
header_remove("Transfer-Encoding"); 
flush(); 

?> 

Este código contiene todavía el "Transfer-Encoding: Chunked "encabezado.

Establece automáticamente el encabezado Transfer-Encoding cuando usa flush, pero cuando lo configura manualmente falla, por lo que para evitar cualquier problema intente eliminarlo. También asegúrese de quitar el encabezado en la línea antes de hacer su primer descarga para evitar errores.

Cuestiones relacionadas