PHP中的“Transfer-Encoding:chunked”标头。什么是“填充”?

时间:2012-11-26 13:35:18

标签: php padding transfer-encoding

正如对上一个问题(PHP External Oauth : how to displaying a waiting message while waiting for callback (not using AJAX))的回复中所建议的那样,我正在使用传输编码:chunked在执行某些任务时显示等待的消息。我的第一次尝试失败了,我在这个问题中找到了一个解决方案“Transfer-Encoding: chunked” header in PHP。有一个1024个空格的“填充”。没有这个填充它不起作用。我用Google搜索,但我找不到这个填充物的用途。以下是示例代码(来自相关问题)。

<?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 个答案:

答案 0 :(得分:1)

我不知道这个填充应该做什么,实际上它应该不起作用(如果我错了,有人可能会启发我)。使用分块编码的想法是您以块的形式发送数据。每个块包含一个包含块长度的行,后跟换行符,然后是块的数据。响应可以包含您想要的多个块。所以基本上包含“Hello”的3个块的响应看起来像这样:

5 <--- this is the length of the chunk, that is "Hello" == 5 chars
Hello  <--- This is a the actual data
<-- an empty line is between the chunks
5
Hello

5
Hello

<-- send two empty lines to end the transmission

所以我将其重写为:

<?php
        header('Content-Encoding', 'chunked');
        header('Transfer-Encoding', 'chunked');
        header('Content-Type', 'text/html');
        header('Connection', 'keep-alive');

        ob_flush();
        flush();

        for ($i = 0; $i < 10000; $i++) {
            $string = "string";
            echo strlen($string)."\r\n"; // this is the length
            echo $string."\r\n"; // this is the date
            echo "\r\n"; // newline between chunks
            ob_flush(); // rinse and repeat
            flush();
            sleep(2);
        } 
        echo  "\r\n"; // send final empty line
        ob_flush();
        flush();

?>

上述代码在任何情况下都不起作用(例如,包含换行符或非ascii编码的字符串),因此您必须根据您的用例进行调整。

答案 1 :(得分:1)

填充用于填充服务器缓冲区,据我所知。

如果没有它,服务器将等待PHP填充它,之后将刷新它 - 即使在PHP代码中你执行flush()

相关: