Заголовок «Transfer-Encoding: chunked» в PHP - PullRequest
7 голосов
/ 26 января 2011

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

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

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

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

что мне нужно сделать, чтобы она работала?

Ответы [ 4 ]

4 голосов
/ 26 января 2011

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

Обновление: сначала вы отправляете заголовки, потому что они всегда должны отправляться перед любым контентом (также с кусочным кодированием).Затем вы отправляете (для каждого куска) размер (в шестнадцатеричном формате), а затем содержимое.Помните 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();
3 голосов
/ 07 января 2013

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

<?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 голос
/ 17 сентября 2015

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

<?php


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

?>

Этот код все еще будет иметь «Transfer-Encoding: chunked"заголовок.

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

0 голосов
/ 05 июля 2012

Использовать 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);
        }

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...