2011-01-26 31 views
6

tôi muốn thêm Transfer-Encoding: chunked tiêu đề để các tập tin mà tôi đang outputing (chỉ cần tạo ra văn bản đơn giản của nó), nhưng khi tôi thêm:"Transfer-Encoding: chunked" tiêu đề trong PHP

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

trình duyệt doesn không muốn mở tệp.

Trang web tại ... có thể là tạm thời không hoạt động hoặc có thể đã di chuyển vĩnh viễn sang địa chỉ web mới.

tôi cần làm gì để nó hoạt động?

+0

bạn có đang gửi tiêu đề 'Content-Length' không? – drudge

+0

không. tôi có nên gửi nó không? – Ddwerffdsf

+0

Không, bạn không nên bao gồm tiêu đề 'Content-Length'.Toàn bộ điểm của 'Chuyển mã hóa: chunked' là nội dung của bạn đang được tạo động, do đó bạn không biết chiều dài nội dung là ưu tiên và do đó không thể đặt tiêu đề này. –

Trả lời

2

Bạn cần gửi Content-Length với mọi đoạn bạn gửi. Hãy xem Wikipedia để có ấn tượng đầu tiên, cách mã hóa chunked trông như thế nào. Nó không phải là tầm thường và trong nhiều trường hợp quá khổ của nó.

Cập nhật: Trước tiên, bạn gửi tiêu đề, vì chúng phải luôn gửi trước bất kỳ nội dung nào (cũng có mã hóa chunked). Sau đó, bạn gửi (cho mỗi đoạn) kích thước (theo hệ thập lục phân) theo sau là nội dung. Hãy nhớ flush() sau mỗi đoạn. Cuối cùng, bạn phải gửi một đoạn không kích thước để đảm bảo rằng kết nối được đóng đúng cách.

của nó chưa được thử nghiệm, nhưng một cái gì đó như mã

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

Tôi có thể làm điều đó với php bằng cách nào? – Ddwerffdsf

+0

Có thực sự không cần phải suy nghĩ về nó, trừ khi bạn phải gửi nội dung của một số MB. Tuy nhiên, tôi sẽ cập nhật câu trả lời của mình với các hướng dẫn cơ bản – KingCrunch

+0

và cách chuyển đổi văn bản thành các phần? ví dụ nếu đầu ra của tôi là 'Hello_World _ :)' – Ddwerffdsf

-2

Sử dụng ob_flush(); trước flush();

mẫu này:

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

Là thành viên trước nói bạn phải tuân theo định dạng mã hóa chuyển chunked.
Trong ví dụ tiếp theo tôi sẽ chỉ cho cách bạn có thể sử dụng chức năng một người sử dụng tuân theo quy tắc định dạng:

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

Ghi chú:

  1. Kiểm tra xem «implicit_flush» là On trong php của bạn. ini
  2. Biết nếu bạn tràn bộ đệm đầu ra («output_buffering» trong php.ini) nó sẽ tự động tuôn ra.
1

Đối với tôi khi tôi đã cố gắng một cái gì đó với "Transfer-Encoding: chunked" Tôi đã phải sử dụng mã này để làm cho nó làm việc:

<?php 


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

?> 

Mã này sẽ vẫn có "Transfer-Encoding: chunked "tiêu đề.

Nó sẽ tự động đặt tiêu đề Chuyển mã hóa khi bạn sử dụng lệnh xả nhưng khi cài đặt theo cách thủ công, nó sẽ không thành công, để tránh mọi sự cố khi cố xóa nó. Ngoài ra hãy chắc chắn rằng bạn loại bỏ các tiêu đề trên dòng trước khi bạn làm tuôn ra đầu tiên của bạn để ngăn chặn lỗi.

Các vấn đề liên quan