2011-01-26 1 views
6

я хочу, чтобы добавить Transfer-Encoding: chunked заголовок файла, который я outputing (его просто генерируется обычный текст), но когда я добавить:«Transfer-Encoding: фрагментированное» заголовок в PHP

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

браузер Безразлично Не хотите открыть файл.

Веб-страница может быть ... временно вниз или он может быть перемещен постоянно на новый веб-адрес.

Что мне нужно для этого работать?

+0

Вы также отправляете заголовок Content-Length? – drudge

+0

нет. должен ли я отправить его? – Ddwerffdsf

+0

Нет, вы не должны включать заголовок 'Content-Length'.Весь смысл «Transfer-Encoding: chunked» заключается в том, что ваш контент динамически генерируется, поэтому вы не знаете длину контента априори и, следовательно, не можете установить этот заголовок. –

ответ

2

Вы должны отправить Content-Length с каждым отправленным вами куском. Посмотрите на Wikipedia на первое впечатление, как выглядит упорядоченное кодирование. Это не то, что тривиально и во многих случаях его негабарит.

Обновление: Сначала вы отправляете заголовки, потому что они должны всегда отправлять их перед любым контентом (также с чередующимся кодированием). Затем вы отправляете (для каждого фрагмента) размер (в шестнадцатеричном виде), за которым следует содержимое. Запомните flush() после каждого куска. Наконец, вы должны отправить нулевой размер, чтобы убедиться, что соединение закрывается должным образом.

Его не проверял, но что-то вроде этого

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

Как предыдущие члены сказали, что вы должны следовать Chunked формат кодирования передачи.
В следующем примере я покажу, как вы можете использовать функцию одного пользователя, чтобы следовать правилам формата:

<?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. Знайте, если вы переполняете выходной буфер («output_buffering» в php.ini), он автоматически закроется.
1

Для меня, когда я пытался что-то с «Transfer-Encoding: фрагментированное» Я должен был использовать этот код, чтобы сделать его работу:

<?php 


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

?> 

Этот код будет иметь «Transfer-Encoding: chunked ".

Он автоматически устанавливает заголовок Transfer-Encoding при использовании флеша, но когда он устанавливает его вручную, он терпит неудачу, поэтому для предотвращения каких-либо проблем попытайтесь его удалить. Также убедитесь, что вы удаляете заголовок на линии до того, как сделаете свой первый сброс, чтобы предотвратить ошибки.

Смежные вопросы