2011-01-26 9 views
6

voglio aggiungere Transfer-Encoding: chunked intestazione al file che sto outputing (il suo testo semplice appena generato), ma quando aggiungo:"Transfer-Encoding: chunked" intestazione in PHP

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

browser doesn Non voglio aprire il file.

La pagina web all'indirizzo ... potrebbe essere temporaneamente o potrebbe essere stata trasferita definitivamente a un nuovo indirizzo web.

cosa devo fare per farlo funzionare?

+0

invii anche un'intestazione 'Content-Length'? – drudge

+0

no. dovrei mandarlo? – Ddwerffdsf

+0

No, non dovresti includere l'intestazione 'Content-Length'.L'intero punto di 'Transfer-Encoding: chunked' è che il contenuto viene generato dinamicamente in modo da non conoscere a priori la lunghezza del contenuto e quindi non è possibile impostare questa intestazione. –

risposta

2

È necessario inviare lo Content-Length con ogni blocco inviato. Guarda Wikipedia per una prima impressione, come appare una codifica chunked. Non è così banale e in molti casi è troppo grande.

Aggiornamento: Prima si inviano le intestazioni, perché devono sempre inviare prima qualsiasi contenuto (anche con codifica Chunked). Quindi si invia (per ogni blocco) la dimensione (in esadecimale) seguita dal contenuto. Ricorda flush() dopo ogni blocco. Alla fine è necessario inviare un blocco a dimensione zero per assicurarsi che la connessione venga chiusa correttamente.

La sua non è testato, ma qualcosa di simile a questo codice

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

come posso farlo con php? – Ddwerffdsf

+0

Non c'è davvero bisogno di pensarci, a meno che non si debba inviare il contenuto di alcuni MB. Tuttavia, aggiornerò la mia risposta con le istruzioni di base – KingCrunch

+0

e come convertire il testo in blocchi? per esempio se il mio output è 'Hello_World _ :)' – Ddwerffdsf

-2

Usa ob_flush(); prima flush();

Esempio:

<?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

Come membri precedenti detto che devi seguire formato di codifica di trasferimento chunked.
Nel prossimo esempio illustra come è possibile utilizzare la funzione un utente a seguire le regole del 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(); 
?> 

Note:

  1. Verificare se «implicit_flush» è Sul nel vostro php. ini
  2. Sapere se si supera il buffer di uscita («output_buffering» in php.ini) si svuota automaticamente.
1

per me quando stavo cercando qualcosa con "Transfer-Encoding: Chunked" Ho dovuto utilizzare questo codice per farlo funzionare:

<?php 


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

?> 

Questo codice sarà ancora avere il "Transfer-Encoding: "Chunked".

Imposta automaticamente l'intestazione Transfer-Encoding quando si utilizza lo svuotamento ma quando viene impostato manualmente non riesce, quindi per evitare problemi, provare a rimuoverlo. Assicurati inoltre di rimuovere l'intestazione sulla linea prima di eseguire il primo flushing per evitare errori.

Problemi correlati