PHP中的“Transfer-Encoding:chunked”标头

时间:2011-01-26 20:39:29

标签: php http header

我想将Transfer-Encoding: chunked标题添加到我正在输出的文件(它刚生成的纯文本),但是当我添加:

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

浏览器不想打开文件。

  

......的网页可能是   暂时停止或可能已经移动   永久保存到新的网址。

我需要做些什么让它起作用?

4 个答案:

答案 0 :(得分:4)

您需要向发送的每个块发送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();

答案 1 :(得分:3)

正如之前的成员所说,你必须遵循分块传输编码格式。
在下一个例子中,我将展示如何使用一个用户功能来遵循格式规则:

<?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. 检查 php.ini
  2. 中的 On
  3. 知道你是否溢出输出缓冲区( php.ini 中的«output_buffering»)它会自动刷新。

答案 2 :(得分:1)

当我尝试使用&#34;转移编码:chunked&#34;我必须使用此代码才能使其正常工作:

<?php


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

?>

此代码仍然具有&#34;传输编码:chunked&#34;头。

当您使用flush时,它会自动设置Transfer-Encoding标题,但是当它手动设置时它会失败,因此要防止出现任何问题,请尝试将其删除。还要确保在执行第一次刷新之前删除行上的标题以防止错误。

答案 3 :(得分:-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);
        }

?>