首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使PHP生成分块响应

如何使PHP生成分块响应
EN

Stack Overflow用户
提问于 2010-03-20 03:59:34
回答 9查看 36.5K关注 0票数 32

我在谷歌上搜索了这个问题,但没有答案。

我希望我的PHP脚本以块( 编码)的形式生成HTTP响应。该怎么做呢?

更新:我想出来了。我必须指定Transfer-encoding头并刷新它。

代码语言:javascript
运行
复制
header("Transfer-encoding: chunked");
flush(); 

冲水是必要的。否则,将生成内容长度标头。

我得自己做块。有了助手函数,就不难了。

代码语言:javascript
运行
复制
function dump_chunk($chunk)
{
    echo sprintf("%x\r\n", strlen($chunk));
    echo $chunk;
    echo "\r\n";
}
EN

回答 9

Stack Overflow用户

发布于 2011-09-23 00:51:25

如果不指定内容长度标头,则PHP响应将始终分块,并且会发生刷新。(这将在x字节之后自动发生,只是不知道确切的数量)。

这是件很奇怪的事。这是一种学术/学习的练习,还是你想要解决的现实世界的问题?

票数 8
EN

Stack Overflow用户

发布于 2012-05-23 12:53:16

这件事有点.如果您不介意大块块(0x1000个八进制左右),那么是的,PHP会制作它们。

代码语言:javascript
运行
复制
<?php

while (true) {
    # output data
    flush()
    usleep(pow(2,18));
}
?>

PHP将生成编号部分,等等。

如果你想发送小块,就像你对AJAX客户端那样.嗯,我把OPs的问题和一些关于PHP.NET的研究结合在一起了,看起来他确实发现了一件好事。

$ echo -en "GET /分块/HTTP/1.1\r\n主机:ec\r\n\r“\ nc localhost 80

代码语言:javascript
运行
复制
HTTP/1.1 200 OK
Date: Wed, 23 May 2012 13:03:01 GMT
Server: Apache/2.2.9 (Debian) PHP/5.3.5-1 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8o
X-Powered-By: PHP/5.3.5-1
Transfer-encoding: chunked
Content-Type: text/html

14
Teachers have class.
50
We secure our friends not by accepting favors but by doing them.
            -- Thucydides
48
Vulcans never bluff.
            -- Spock, "The Doomsday Machine", stardate 4202.1
31
All kings is mostly rapscallions.
            -- Mark Twain
41
Reappraisal, n.:
    An abrupt change of mind after being found out.
49
He who knows, does not speak.  He who speaks, does not know.
            -- Lao Tsu

它是否最终会挤出它自己的(不正确的)块数,还有待观察.但我没看到任何迹象。

代码语言:javascript
运行
复制
<?php
header("Transfer-encoding: chunked");
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
for ($i = 0; $i < ob_get_level(); $i++)  ob_end_flush();
ob_implicit_flush(1); flush();

function dump_chunk($chunk)
{
  printf("%x\r\n%s\r\n", strlen($chunk), $chunk);
  flush();
}

for (;;) {
  $output = array();
  exec("/usr/games/fortune", $output);
  dump_chunk(implode("\n", $output));
  usleep(pow(2,18));
}
?>
票数 6
EN

Stack Overflow用户

发布于 2013-02-15 23:16:45

截至2013年2月16日的工作样本

代码语言:javascript
运行
复制
<?php

function dump_chunk($chunk) {
    //echo sprintf("%x\r\n", strlen($chunk));
    echo sprintf("\r\n");
    echo $chunk;
    echo "\r\n";
}

ob_start();
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Title</title>
    </head>
    <body>
        <?php
        ob_end_flush();
        flush();
        ob_flush();
        for ($i = 0; $i < 5; $i++) {
            sleep(1);
            dump_chunk('Sending data chunk ' . ($i + 1) . ' of 1000 <br />');
            flush();
            ob_flush();
        }
        sleep(1); // needed for last animation
        ?>
    </body>
</html>
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2481858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档