2011-01-26 4 views
6

나는 출력하고있는 파일에 Transfer-Encoding: chunked 헤더를 추가하고 싶지만, 추가 할 때 :PHP의 "Transfer-Encoding : chunked"헤더

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

브라우저가 파일을 열고 싶지 않습니다.

...의 웹 페이지는 이 일시적으로 다운되었거나 을 새 웹 주소로 영구적으로 이동했을 수 있습니다.

작동하려면 어떻게해야합니까?

+0

당신은 또한'Content-Length' 헤더를 보내고 있습니까? – drudge

+0

번. 내가 보낼 까? – Ddwerffdsf

+0

아니요,'Content-Length' 헤더를 포함하면 안됩니다.'Transfer-Encoding : chunked'의 핵심은 콘텐츠가 동적으로 생성되어서 콘텐츠 길이를 미리 알 수 없으므로이 헤더를 설정할 수 없다는 것입니다. –

답변

2

귀하가 보내는 모든 청크와 함께 Content-Length을 보내야합니다. Wikipedia에서 청크 인코딩이 어떻게 보이는지 첫 번째 인상을보십시오. 그 사소한 아니라 많은 경우에 그것의 대형.

업데이트 : 먼저 헤더를 보내야합니다. 헤더는 항상 내용을 보내기 전에 (청크 분할 인코딩과 함께) 보내기해야하기 때문입니다. 그런 다음 (모든 청크에 대해) 크기 (16 진수)와 내용을 차례로 보냅니다. 모든 청크 다음에 flush()을 기억하십시오. 마지막으로 연결이 제대로 닫히지 않도록 반드시 크기가 0 인 청크를 보내야합니다.

그것은 테스트를하지만, 뭔가이

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

어떻게 PHP로 할 수 있습니까? – Ddwerffdsf

+0

일부 MB의 콘텐츠를 보내야 만 않는 한 그것에 대해 생각할 필요가 없습니다. 그러나 기본 지침 – KingCrunch

+0

으로 답변을 업데이트하고 텍스트를 청크로 변환하는 방법은 무엇입니까? 예를 들어 출력물이'Hello_World _ :)'이면 – Ddwerffdsf

-2

사용 ob_flush();

flush(); 전에 샘플 코드와 같은하지 :

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

이전 멤버는 청크 분할 전송 인코딩 형식을 수행 할 필요가 말했듯이. 다음 예에서
난 당신이 형식의 규칙을 따르도록 한 사용자 기능을 사용하는 방법을 보여줍니다 :

<?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(); 
?> 

참고을 :

  1. 확인«implicit_flush»당신의 PHP에인 경우. ini
  2. 출력 버퍼 ( 이 ​​ php.ini)가 오버 플로우 된 경우 자동으로 플러시됩니다.
  3. 나를 위해
1

내가 뭔가 노력했다

<?php 


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

?> 

이 코드는 여전히 "전송 인코딩을해야합니다 : 나는 그것이 작동되도록하려면이 코드를 사용했다"전송 인코딩 청크 " 청크 "헤더.

플러시를 사용할 때 자동으로 전송 인코딩 제목을 설정하지만 수동으로 설정하면 실패하므로 문제가 발생하지 않도록하십시오. 또한 오류를 방지하기 위해 첫 번째 플러시를 수행하기 전에 줄에서 제목을 제거해야합니다.